XML 反序列化,保留不同标记之间的顺序
本文关键字:之间 顺序 反序列化 保留 XML | 更新日期: 2023-09-27 18:32:16
我有xml(我无法控制),我需要用XmlSerializer反序列化。我的麻烦是我需要在单个列表中保留两个不同标签之间的顺序。我举个例子:
<users>
<luser>..some more elements..</luser>
<luser>..some more elements..</luser>
<admin>..different elements than in luser</admin>
<luser>..some more elements..</luser>
<admin>..different elements than in luser</admin>
<luser>..some more elements..</luser>
<admin>..different elements than in luser</admin>
<users>
现在,如果我以直接的方式反序列化它,我最终会得到两个列表,一个用于用户,一个用于管理员。但是,它们出现的顺序是隐式 ID!(当然,这应该是xml中的属性或元素,但可惜它不是)
我尝试制作这样的元元素
[XmlElement("luser"),XmlElement("admin")]
public List<Person> Person { get; set; }
跟
public class Person
{
public Luser Luser { get; set; }
public Admin Admin { get; set; }
}
其中计划是检查列表以查看条目是 luser 还是管理员,并让人员包装器维护元素的顺序。但是,单个属性上的多个 XmlElement 属性似乎是非法的。
另一个可接受的解决方案是最终得到两个列表,但每个列表中的每个条目都有一个 ID,我可以用来获取原始订单。
我希望它尽可能干净。之后搜索 xml 以查找订单、手动提取标签等,是我会避免并作为最后的手段做的事情。
这当然应该是一个属性...
然后尽快将其设为属性。然后处理结果。
var doc = XDocument.Load(...);
var fixeruppers = doc
.Descendants("users")
.Elements()
.ToList(); // isolate us from any movements in the doc
int id = 1; // base
foreach (var fixer in fixeruppers)
fixer.SetAttributeValue("Id", id++);
XmlReader readerForDeserialize = doc.CreateReader();
下面将指示顺序(使用 order:= 值),它不会改变类的序列化方式。
Imports System.Runtime.Serialization
Imports System.ServiceModel
<DataContract()> _
Public Class MyClass
<DataMember(order:=1)> _
Public Property SomeData() As String
<DataMember(order:=2)> _
Public Property SomeOtherData() As String
End Class