2

xml をオブジェクトの配列に逆シリアル化するために使用できる汎用メソッドを作成しようとしています。

次のような XML を指定します。

<people>
    <person>
        <someElement>content</someElement>
    </person>
    <person>
        <someElement>more content</someElement>
    </person>
</people>

以下のコードでは として示されていますxmlDoc。そして、personクラスT

XmlNodeReader reader = new XmlNodeReader(xmlDoc.DocumentElement);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T[]), new XmlRootAttribute(xmlDoc.DocumentElement.Name));
results = xmlSerializer.Deserialize(reader) as T[];

person[]これは期待どおりに機能し、2 つのエントリで返されます。

ただし、私が使用している API では、結果が 1 つしか返されない場合は、次のように返されます。

<person>
    <someElement>content</someElement>
</person>

そして、私の逆シリアル化は失敗します。person[]空のままです。

これを実装する最良の方法について何か考えはありますか?

編集

間に XSLT を実行しT、ルート ノードと一致する場合は in の名前を渡し、ラッピング ノードを追加することを考えています。

4

2 に答える 2

1

最終的に XSLT を使用して、目的のノードがルートでないことを確認しました。

基本的に、次を含むXSLTファイルがあります。

<xsl:template match="/">
    <rootNode>
        <xsl:apply-templates select="node()|@*"/>
    </rootNode>
</xsl:template>

(この XSLT が理想的かどうかはわかりません。コメントをいただければ幸いです)。

これにより、API からの受信 XML がラップされます。前述Personのクラスには[XmlType("person")]属性が適用されており、それを使用して実行できます。

//using reflection to look what the XmlType has been declared on this type
var typeAttributes = Attribute.GetCustomAttribute(typeof(T), typeof(XmlTypeAttribute));

//determine an xpath query to find this type of elements parent
string xPathtoTypeName = string.Format("//{0}/parent::node()", ((XmlTypeAttribute)typeAttributes).TypeName);

//use the above xpath query to find the parent node.
var parentNode = transformedDocument.SelectSingleNode(xPathtoTypeName);

//deserialize as before
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T[]), new XmlRootAttribute(parentNode.Name));
XmlNodeReader nodeReader = new XmlNodeReader(parentNode);
results = xmlSerializer.Deserialize(nodeReader) as T[];
于 2010-06-22T10:07:04.737 に答える
0

ルート要素の Name を確認し、そうでない場合はpeoplexml に追加すると、すべてうまくいきます。


更新: xml ドキュメントの詳細を確認し、その == 2 の場合は、ルート要素を作成します。別の方法 - LINQ-TO-XML の使用 -要素XElement.Descandants("person")の配列person

于 2010-06-21T09:00:41.197 に答える