在 C# 中使用换行符对字符串元素进行 XML 反序列化
Posted
技术标签:
【中文标题】在 C# 中使用换行符对字符串元素进行 XML 反序列化【英文标题】:XML Deserialization of string elements with newlines in C# 【发布时间】:2011-12-11 21:57:41 【问题描述】:我似乎无法弄清楚为什么这个测试没有通过
测试是:
给定以下 XML:
<?xml version="1.0" encoding="utf-8"?>
<foo>
<account>
1234567890
</account>
<deptCode>
ABCXYZ
</deptCode>
</foo>
还有以下类:
class Foo
[XmlElement(ElementName = "account", DataType = "normalizedString")]
string account;
[XmlElement(ElementName = "deptCode", DataType = "normalizedString"]
string deptCode;
当该 XML 被反序列化时:
XmlSerializer serializer = new XmlSerializer(typeof(Foo));
Foo myFoo = (Foo) serializer.Deserialize(xmlReader);
我得到以下值:
Foo.account = "\r\n 1234567890 \r\n"
Foo.deptCode = "\r\n ABCXYZ \r\n"
而不是预期的
Foo.account = "1234567890"
Foo.deptCode = "ABCXYZ"
我怎样才能使反序列化过程给我预期的结果?我认为DataType="normalizedString"
可能会这样做,但它似乎没有效果,当我使用XmlReaderSettings.IgnoreWhitespace
时,它只是去掉了“\r”字符,留下了“\n 1234567890”
【问题讨论】:
反序列化对象的代码是什么?可能您需要在反序列化器上设置一些选项。 添加了有问题的反序列化代码,我能看到的唯一相关设置是前面提到的 XmlReaderSettings.IngoreWhitespace,它仍然给我留下了换行符。 xmlReader是什么类型的?你在使用 XmlTextReader 吗? XmlReader 和 XmlTextReader 似乎都不起作用 【参考方案1】:它似乎按预期工作。来自IgnoreWhitespace
文档:
不重要的空白包括用于分隔标记以提高可读性的空格、制表符和空行。
基本上,它的作用是保留(当设置为false
)元素之间的空格,例如:
<Foo>
<bar>Text</bar>
</Foo>
<Foo>
和 <bar>
之间的换行符将由阅读器返回。将IgnoreWhitespace
设置为true
,不会。
如 Kirill 所述,要实现您的目标,您必须进行程序化修剪。当您考虑它时,读者应该如何知道元素的纯字符串内容的空白(如您的示例中)是仅用于缩进目的还是实际内容?
有关忽略空格的更多信息,您可能需要查看 here 和 here。
【讨论】:
【参考方案2】:您可以创建自定义XmlTextReader
类:
public class CustomXmlTextReader : XmlTextReader
public CustomXmlTextReader(Stream stream) : base(stream)
public override string ReadString()
return base.ReadString().Trim();
【讨论】:
【参考方案3】:尝试使用XmlTextReader
进行反序列化,并将WhiteSpaceHandling
属性设置为WhiteSpaceHandling.None
和Normalization = true
【讨论】:
不幸的是 XmlTextReader 和 WhiteSpaceHandling.None 没有效果 设置 Normalization = true 怎么样?默认为假。我认为这应该将 \n 转换为空白。 Normalization = true 将 "\r\n" 转换为 "\n" 但将换行符保留在那里。 XmlReaderSettings.IgnoreWhitespace 也删除了“\r”,但我无法测试两者的组合,因为我似乎只能将 XmlReaderSettings 实例添加到普通 XmlReader 而不是 XmlTextReader(构造函数没有设置参数,并且settings 属性没有设置器)以上是关于在 C# 中使用换行符对字符串元素进行 XML 反序列化的主要内容,如果未能解决你的问题,请参考以下文章