使用C#中的换行符对XML元素进行XML反序列化

时间:2011-10-20 15:36:36

标签: c# .net xml serialization xml-deserialization

我似乎无法弄清楚为什么这个测试没有通过

测试是:

给出以下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>

3 个答案:

答案 0 :(得分:4)

它似乎按预期工作。来自IgnoreWhitespace文档:

  

不被视为重要的空格包括用于分隔标记的空格,制表符和空行,以提高可读性。

基本上,它所做的是保留(设置为false时)元素之间的空格,例如:

<Foo>

<bar>Text</bar>
</Foo>

读者可以返回<Foo><bar>之间的换行符。将IgnoreWhitespace设置为true,但不会。{/ p>

为了实现你的目标,你必须按照Kirill的说法进行程序化修剪。当你考虑它时,读者如何知道元素的纯字符串内容的空白(如在你的例子中)是仅用于缩进目的还是实际内容?

有关忽略空格的更多信息,您可能需要查看herehere

答案 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.NoneNormalization = true