Xml 反序列化。是不是可以从 xml 保存字符串格式?

Posted

技术标签:

【中文标题】Xml 反序列化。是不是可以从 xml 保存字符串格式?【英文标题】:Xml deserialization. Is it possible to save string format from xml?Xml 反序列化。是否可以从 xml 保存字符串格式? 【发布时间】:2020-07-04 03:48:14 【问题描述】:

我正在使用new XmlSerializer(typeof(R)) 从 xml 中获取对象。

但是我遇到了一个问题,xml中的属性值有一些格式,例如:

<dueNote value="Дата перевода валюты = 12.03.2020 18:31:58
Курс доллара к рублю = 71.472
Курс франка к рублю = 76.457
Курс евро к рублю = 81.0207
Тип расчетного расстояния = 2
"/>

是否有可能以某种方式保存 xml 属性的格式?目前在反序列化后,这个字符串变得扁平,没有任何换行符等。

有没有像'XmlAttrubte' 这样的注释来响应格式化?

代码:

[XmlElement("dueNote")]
public StringValueElement DueNote  get; set; 

public class StringValueElement

    [XmlAttribute("value")]
    public string Value  get; set; 

    public StringValueElement(object value)
    
        Value = Convert.ToString(value);
    

    public StringValueElement()
    
    

【问题讨论】:

由于缺少语言标签,您的问题没有引起太多关注。 【参考方案1】:

您可以使用 XML 字符实体来标记属性值内的行尾

<?xml version="1.0"?>
<dueNote value="Дата перевода валюты = 12.03.2020 18:31:58&#xA;
Курс доллара к рублю = 71.472&#xA;
Курс франка к рублю = 76.457&#xA;
Курс евро к рублю = 81.0207&#xA;
Тип расчетного расстояния = 2&#xA;
">
</dueNote>

属性值只能是纯文本,不能是结构化文本,特殊字符需要编码为字符实体。

XML 属性值中允许换行,但根据 W3C 的建议,您的 XML 解析器应将所有空白字符标准化为空格 (0x20)。

http://www.w3.org/TR/1998/REC-xml-19980210#AVNormalize

【讨论】:

我收到了来自国外 API 的响应,我不能在属性末尾添加额外的字符。有没有办法使用 XmlReaderSettings 解决这个问题? 遗憾的是没有设置来处理这个问题。 xml 规范声明解析器应该将换行符规范化为空格字符。答案已更新。【参考方案2】:

大多数 xml 解析器通过删除不必要的空格来规范化属性的内容。但不是全部。

您可以使用XmlTextReader。它将保留空白。

R root;
var serializer = new XmlSerializer(typeof(R));

using (var reader = new XmlTextReader("test.xml")) // new XmlTextReader(stream);

    root = (R)serializer.Deserialize(reader);

Console.WriteLine(root.DueNote.Value);

【讨论】:

以上是关于Xml 反序列化。是不是可以从 xml 保存字符串格式?的主要内容,如果未能解决你的问题,请参考以下文章

如何从动态对象中获取反序列化的 xml 属性

直接反序列化到/从 XML Linq

Xml 反序列化到对象,反射到类型

从字符串反序列化 XML

使用 Jackson 从 XML 到 POJO 的反序列化问题:没有从字符串值反序列化的字符串参数构造函数/工厂方法

在改造android中使用简单的xml转换器反序列化html转义字符