【问题标题】:XML Deserialization of string elements with newlines in C#在 C# 中使用换行符对字符串元素进行 XML 反序列化
【发布时间】: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 似乎都不起作用

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


【解决方案1】:

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

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

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

<Foo>

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

&lt;Foo&gt;&lt;bar&gt; 之间的换行符将由阅读器返回。将IgnoreWhitespace设置为true,不会。

如 Kirill 所述,要实现您的目标,您必须进行程序化修剪。当您考虑它时,读者应该如何知道元素的纯字符串内容的空白(如您的示例中)是仅用于缩进目的还是实际内容?

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

【讨论】:

    【解决方案2】:

    您可以创建自定义XmlTextReader 类:

    public class CustomXmlTextReader : XmlTextReader
    {
        public CustomXmlTextReader(Stream stream) : base(stream) { }
    
        public override string ReadString()
        {
            return base.ReadString().Trim();
        }
    }
    

    【讨论】:

      【解决方案3】:

      尝试使用XmlTextReader 进行反序列化,并将WhiteSpaceHandling 属性设置为WhiteSpaceHandling.NoneNormalization = true

      【讨论】:

      • 不幸的是 XmlTextReader 和 WhiteSpaceHandling.None 没有效果
      • 设置 Normalization = true 怎么样?默认为假。我认为这应该将 \n 转换为空白。
      • Normalization = true 将 "\r\n" 转换为 "\n" 但将换行符保留在那里。 XmlReaderSettings.IgnoreWhitespace 也删除了“\r”,但我无法测试两者的组合,因为我似乎只能将 XmlReaderSettings 实例添加到普通 XmlReader 而不是 XmlTextReader(构造函数没有设置参数,并且settings 属性没有设置器)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多