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

6 .net c# xml serialization xml-deserialization

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

测试是:

给出以下XML:

<?xml version="1.0" encoding="utf-8"?>
  <foo>
<account>
 1234567890
</account>
<deptCode>
 ABCXYZ
</deptCode>
</foo>
Run Code Online (Sandbox Code Playgroud)

和以下课程:

class Foo  {

  [XmlElement(ElementName = "account", DataType = "normalizedString")]
  string account;

  [XmlElement(ElementName = "deptCode", DataType = "normalizedString"]
  string deptCode;

}
Run Code Online (Sandbox Code Playgroud)

当使用以下方式对XML进行反序列化时:

XmlSerializer serializer = new XmlSerializer(typeof(Foo));
Foo myFoo = (Foo) serializer.Deserialize(xmlReader);
Run Code Online (Sandbox Code Playgroud)

我得到以下值:

Foo.account = "\r\n 1234567890 \r\n"
Foo.deptCode = "\r\n ABCXYZ \r\n"
Run Code Online (Sandbox Code Playgroud)

而不是预期的

Foo.account = "1234567890"
    Foo.deptCode = "ABCXYZ"
Run Code Online (Sandbox Code Playgroud)

我怎样才能使反序列化过程给我预期的结果?我认为DataType="normalizedString"可能会这样做,但它似乎没有效果,当我使用时XmlReaderSettings.IgnoreWhitespace,它只会带走"\ r"字符,留下"\n 1234567890"

k.m*_*k.m 4

看起来它正在按预期工作。来自IgnoreWhitespace文档:

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

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

<Foo>

<bar>Text</bar>
</Foo>
Run Code Online (Sandbox Code Playgroud)

<Foo>和之间的换行符<bar>将由读者返回。设置IgnoreWhitespacetrue,则不会。

为了实现你的目标,你必须进行程序化的修剪,正如基里尔提到的那样。当您考虑一下时,读者应该如何知道元素的纯字符串内容的空格(如您的示例中)是否仅用于缩进目的或实际内容?

有关忽略空格的更多阅读,您可能需要查看此处此处