4

我有需要用 XmlSerializer 反序列化的 xml(我无法控制)。我的麻烦是我需要在一个列表中保留两个不同标签之间的顺序。让我举个例子吧:

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

现在,如果我以直接的方式反序列化,我最终会得到两个列表,一个用于 luser,一个用于管理员。但是,它们出现的顺序是隐式 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 搜索以查找订单、手动提取标签以及类似的操作,是我会避免并作为最后手段做的事情。

4

2 回答 2

4

这当然应该是一个属性...

然后尽快将其设为属性。然后处理结果。

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();
于 2012-04-26T14:54:06.513 回答
-2

以下将指示顺序(使用 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
于 2012-04-26T14:55:14.470 回答