在 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>

&lt;Foo&gt;&lt;bar&gt; 之间的换行符将由阅读器返回。将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.NoneNormalization = true

【讨论】:

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

以上是关于在 C# 中使用换行符对字符串元素进行 XML 反序列化的主要内容,如果未能解决你的问题,请参考以下文章

C#中具有复杂元素的Xml反序列化[重复]

在C#中序列化和反序列化之间保留xml元素的顺序

如何反序列化 C# 中只有属性的 xml 元素?

如何在c#中使用具有相同名称但不同属性和结构的元素反序列化XML

使用c#反序列化xml中的重复元素

如何在将 xml 反序列化为 c# 对象时获取单个 xml 元素的多个值?