【发布时间】:2018-06-14 06:24:00
【问题描述】:
我有以下测试 XML 字符串:
<?xml version="1.0" encoding="UTF-8"?>
<test id="myid">
<b>b1</b>
<a>a2</a>
<a>a1</a>
<b>b2</b>
</test>
我使用此类反序列化:
[XmlRoot(ElementName = "test")]
public class Test
{
[XmlElement(ElementName = "a")]
public List<string> A { get; set; }
[XmlElement(ElementName = "b")]
public List<string> B { get; set; }
[XmlAttribute(AttributeName = "id")]
public string Id { get; set; }
}
如果我现在要序列化对象,结果将是:
<?xml version="1.0" encoding="utf-16"?>
<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="myid">
<a>a2</a>
<a>a1</a>
<b>b1</b>
<b>b2</b>
</test>
有没有办法保持初始排序顺序?
我想我不能使用[XmlElementAttribute(Order = x)],因为订单不应该是硬编码的,而是与初始 xml 相同。
我想过像这样在我的列表中添加一个订单属性
[XmlRoot(ElementName="a")]
public class A
{
[XmlAttribute(AttributeName="order")]
public string Order { get; set; }
[XmlText]
public string Text { get; set; }
}
[XmlRoot(ElementName="b")]
public class B
{
[XmlAttribute(AttributeName="order")]
public string Order { get; set; }
[XmlText]
public string Text { get; set; }
}
[XmlRoot(ElementName="test")]
public class Test
{
[XmlElement(ElementName="a")]
public List<A> A { get; set; }
[XmlElement(ElementName="b")]
public List<B> B { get; set; }
[XmlAttribute(AttributeName="id")]
public string Id { get; set; }
}
但我不知道在序列化时如何按它们排序。
【问题讨论】:
-
出于好奇,您是否有理由需要 XML 以特定顺序排列?在我看来,只有在将数据加载或反序列化回对象时才会使用这种排序。
-
@gmiley 我正在开发一个 Office VSTO 插件,它允许您添加自己的功能区选项卡,其中包含在 XML 中定义的 UI 元素。 xml 元素顺序表示功能区 UI 顺序(例如:保存按钮 - 关闭按钮或关闭按钮 - 保存按钮)
-
如果你想一想 -
Test类不包含任何关于“原始”订单的信息,所以没有办法做到这一点。 -
然后你会按照你的想法添加一个排序属性/元素并对集合执行排序。忘记你的 xml 的顺序。
-
@gmiley 仅对 a 和 b 进行排序不会使 b 的一个元素在 a 之前成为可能(如我的示例所示)。
标签: c# xml xml-serialization xmlserializer