4

XmlSerializerで逆シリアル化する必要のあるxml(制御できません)があります。私の問題は、1つのリスト内の2つの異なるタグ間の順序を保持する必要があることです。例を挙げましょう:

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

さて、これを簡単な方法で逆シリアル化すると、2つのリストができあがります。1つはルーサー用、もう1つは管理者用です。ただし、それらが表示される順序は暗黙の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またはadminであるかどうかを確認するためにリストをチェックし、peopleラッパーに要素の順序を維持させることでした。ただし、1つのプロパティの複数のXmlElement属性は違法のようです。

もう1つの受け入れ可能な解決策は、2つのリストで終わることですが、各リストの各エントリには、元の注文を取得するために使用できる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 に答える