0

C# プロジェクトの場合、API にクエリを実行すると、次のような XML が返されます。

<itemlist>
  <item attrib1="Value1" attrib2="Value2"... attrib15="Value15">
    <sometypeinfo1 attrib1="Value1" attrib2="Value2"... attrib15="Value15">
      <subelement>
        <someproperty attrib1="Value1" attrib2="Value2"/>
        <someproperty attrib1="Value1" attrib2="Value2"/>
        <someproperty attrib1="Value1" attrib2="Value2"/>
      </subelement>
    </sometypeinfo1>
    <sometypeinfo2>
      <subelement attrib1="Value1" attrib2="Value2">
        <someproperty>
          <somedescription attrib1="Value1" attrib2="Value2"/>
          <somedescription attrib1="Value1" attrib2="Value2"/>
        </someproperty>
      </subelement>
    </sometypeinfo2>
    <sometypeinfo3 attrib1="Value1" attrib2="Value2"/>
    <sometypeinfo4>
      <someproperty attrib1="Value1" attrib2="Value2"/>
    </sometypeinfo4>
    <sometypeinfo5>
      <someproperty attrib="somevalue"/>
    </sometypeinfo5>
    <somemodifiers>
      <somemodifier attrib1="Value1" attrib2="Value2"/>
      <somemodifier attrib1="Value1" attrib2="Value2"/>
      <somemodifier attrib1="Value1" attrib2="Value2"/>
    </somemodifiers>
    <someflags>
      <someflag attrib="somevalue"/>
      <someflag attrib="somevalue"/>
      <someflag attrib="somevalue"/>
    </someflags>
  </item>
  <item>
  .
  .
  .
  </item>
</itemlist>

その基本的には、1 ファイルあたり 100 項目までのリストであり、すべての項目に多くの説明、属性などが含まれています。これは珍しいことではありません。クラスまたはデータセットへのマッピングに問題があります。たとえば、この行

<sometypeinfo1 attrib1="Value1" attrib2="Value2"... attrib15="Value15">

1 つの項目には attrib1 がなく、別の項目には attrib2 がなく、3 番目の項目には 15 個すべてが含まれている場合があります。

「someflags」と同様に、5 つの「someflag」を持つ 1 つのアイテム、2 つだけの次のアイテムなどがあります。すべての要素または属性が存在する可能性がありますが、そうである必要はありません。そのため、それらはすべて要素/属性のプールを共有しており、これがシリアル化などで行き詰まる場所です。

はい、私はこれが初めてです。しかし、これまでに学んだことから、XML を適切にマッピングするには、スキーマにすべての要素/属性が必要ですか?

頭に浮かぶ唯一のことは、すべての可能な要素などを収集する別のツールを作成し、最初にすべてを NULL にするクラスを作成し、XML を解析して、実際の項目で見つかったすべてを上書きすることです。

4

2 に答える 2

0

同様の問題に遭遇し、XSLT スタイル シートを使用して元の XML の属性を新しい XML ドキュメントの要素に変換しました (XSLT を XslTransform オブジェクトにロードして元の XML を変換しました)。次に、新しい XML ドキュメントが DataSet オブジェクトに読み込まれました。

msdn の記事を参照してください: Inferring DataSet Relational Structure from XML および Inferring Relationships

上記の XML を属性から要素に変換するための部分的な XSLT の例:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" omit-xml-declaration="no"/>
    <xsl:template match="/">
        <xsl:apply-templates select="/itemlist"/>
    </xsl:template>
    <xsl:template match="itemlist">
        <xsl:element name="itemlist">
            <xsl:apply-templates select="item"/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="item">
        <xsl:element name="item">
            <xsl:element name="attrib1">
                <xsl:value-of select="@attrib1"/>
            </xsl:element>
            <xsl:element name="attrib2">
                <xsl:value-of select="@attrib2"/>
            </xsl:element>
            <xsl:element name="attrib3">
                <xsl:value-of select="@attrib3"/>
            </xsl:element>
            <!-- continue above pattern for all 15 attributes. -->
            <xsl:apply-templates select="sometypeinfo1"/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="sometypeinfo1">
        <xsl:element name="sometypeinfo1">
            <xsl:element name="attrib1">
                <xsl:value-of select="@attrib1"/>
            </xsl:element>
            <xsl:element name="attrib2">
                <xsl:value-of select="@attrib2"/>
            </xsl:element>
            <xsl:element name="attrib3">
                <xsl:value-of select="@attrib3"/>
            </xsl:element>
                <!-- continue above pattern for all 15 attributes. -->
                <xsl:apply-templates select="subelement"/>
            </xsl:element>
        </xsl:element>
    </xsl:template>
    <xsl:template match="subelement">...
于 2013-10-22T23:09:44.840 に答える