我似乎无法弄清楚为什么这个测试没有通过
测试是:
给出以下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”< / p>
答案 0 :(得分:4)
它似乎按预期工作。来自IgnoreWhitespace
文档:
不被视为重要的空格包括用于分隔标记的空格,制表符和空行,以提高可读性。
基本上,它所做的是保留(设置为false
时)元素之间的空格,例如:
<Foo>
<bar>Text</bar>
</Foo>
读者可以返回<Foo>
和<bar>
之间的换行符。将IgnoreWhitespace
设置为true
,但不会。{/ p>
为了实现你的目标,你必须按照Kirill的说法进行程序化修剪。当你考虑它时,读者如何知道元素的纯字符串内容的空白(如在你的例子中)是仅用于缩进目的还是实际内容?
答案 1 :(得分:3)
您可以创建自定义XmlTextReader
类:
public class CustomXmlTextReader : XmlTextReader
{
public CustomXmlTextReader(Stream stream) : base(stream) { }
public override string ReadString()
{
return base.ReadString().Trim();
}
}
答案 2 :(得分:1)
尝试使用XmlTextReader
进行反序列化,WhiteSpaceHandling
属性设置为WhiteSpaceHandling.None
和Normalization = true