0

XML ドキュメントを逆シリアル化しようとしています。そのノードの 1 つを次のように表すことができます。

<n1 zone="00000" id="0000" />

またはこれ:

<n2 zone="00000" id="0000" />

またはこれ:

<n3 zone="00000" id="0000" />

私のドキュメントでは、常に 1 つの "n1" ノード、1 つの "n2" ノード、または 1 つの "n3" ノードを使用します。これらすべてのフラグメントをこのクラスのインスタンスにデシリアライズしたいと思います:

[Serializable]
public class N
{
    [XmlAttribute("zone")]
    public string Zone { get; set; }

    [XmlAttribute("id")]
    public string Id { get; set; }
}

しかし、私はそれをすることができませんでした。ドキュメントでは、これを実現するために XmlChoiceIdentifier 属性を使用することを提案していますが、間違った方法で使用した可能性があります。

何か案が ?

PS : N1、N2、および N3 の 3 つのクラスを作成し、それらをさまざまな種類の XML フラグメントにマップできることはわかっています。しかし、私はよりクリーンなソリューションを好みます。

4

3 に答える 3

1

次のようなものがあると仮定します。

<?xml version="1.0"?>
<ns> 
  <n1 id="0000" zone="00000"/> 
  <n2 id="0000" zone="00000"/> 
  <n3 id="0000" zone="00000"/> 
</ns>

LINQ to XMLを使用できます。

XDocument document = XDocument.Load(path);
XElement parentNode = document.Element("ns");
var childNodes = parentNode.Elements().Where(x => x.Name.ToString().StartsWith("n")); //this prevent from take elements wich didn't start with n

List<N> list = new List<N>();
foreach (XElement element in childNodes) {
    N n = new N(){ 
        Id = element.Attribute("id").Value, 
        Zone = element.Attribute("zone").Value 
    };

    list.Add(n);
}
于 2012-10-17T10:11:50.037 に答える
0

LINQ-To-Xml を使用できます

XDocument x = XDocument.Parse(
           "<root><n1 zone=\"0000\" id=\"0000\"/><n2 zone=\"0001\" id=\"0011\"/><n3 zone=\"0002\" id=\"0022\"/></root>");

var result = from c in x.Element("root").Descendants()
             select new N { Zone = c.Attribute("zone").Value, 
                            Id = c.Attribute("id").Value };

あなたが目指していると思うシリアライザーを使用していませんが、それは前進です。

于 2012-10-17T10:05:41.130 に答える
0

以下は、XmlChoiceIdentifier の使用方法に関するかなりわかりやすい読み物です。

http://msdn.microsoft.com/en-us/magazine/cc164135.aspx

これに本当に問題がある場合は、常に XSL 変換を使用して最初にマッピングを行うことができます。

于 2012-10-17T09:52:48.053 に答える