【问题标题】: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()
    {
    }
}

【问题讨论】:

  • 由于缺少语言标签,您的问题没有引起太多关注。

标签: c# xml .net-core xmlserializer


【解决方案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);

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 2021-11-01
    • 2018-01-19
    • 2017-02-26
    • 1970-01-01
    • 2010-10-11
    • 2011-04-06
    相关资源
    最近更新 更多