2

このようにフォーマットされたいくつかのxmlファイルがあります:

<ROOT>
  <OBJECT>
    <identity>
        <id>123</id>
    </identity>     
    <child2 attr = "aa">32</child2>
    <child3>
        <childOfChild3 att1="aaa" att2="bbb" att3="CCC">LN</childOfChild3>
    </child3>
    <child4>
        <child5>
            <child6>3ddf</child6>
            <child7>
                <childOfChild7 att31="RR">1231</childOfChild7>
            </child7>
        </child5>
    </child4>
  </OBJECT>
  <OBJECT>
    <identity>
        <id>124</id>
    </identity>     
    <child2 attr = "bb">212</child2>
    <child3>
        <childOfChild3 att1="ee" att2="ccc" att3="EREA">OP</childOfChild3>
    </child3>
    <child4>
        <child5>
            <child6>213r</child6>
            <child7>
                <childOfChild7 att31="EE">1233</childOfChild7>
            </child7>
        </child5>
    </child4>
  </OBJECT>
</ROOT>

どうすればこのようにフォーマットできますか?:

<ROOT>
    <OBJECT>    
        <id>123</id>
        <child2>32</child2> 
        <attr>aa</attr>
        <child3></child3>
        <childOfChild3>LN</childOfChild3>
        <att1>aaa</att1>
        <att2>bbb</att2>
        <att3>CCC</att3>
        <child4></child4>
        <child5></child5>
        <child6>3ddf</child6>
        <child7></child7>
        <childOfChild7>1231</childOfChild7>
        <att31>RR</att31>
    </OBJECT>
        <OBJECT>    
        <id>124</id>
        <child2>212</child2>    
        <attr>bb</attr>
        <child3></child3>
        <childOfChild3>LN</childOfChild3>
        <att1>ee</att1>
        <att2>ccc</att2>
        <att3>EREA</att3>
        <child4></child4>
        <child5></child5>
        <child6>213r</child6>
        <child7></child7>
        <childOfChild7>1233</childOfChild7>
        <att31>EE</att31>
    </OBJECT>   
</ROOT>

私はいくつかの C# を知っているので、そこにパーサーがあるのでしょうか? または一般的なxslt?xml ファイルはクライアントから受け取ったデータなので、送信方法を制御することはできません。

LE 基本的に、このデータを Excel でテストしようとすると (たとえば、childOfChild7 の属性が正しい ID ID に対応していることを確認したい場合)、多くの空白が表示されます。必要なデータのみを取得するためにアクセスでインポートする場合、それらすべてを適切なテーブルに取得するには、何千ものサブクエリを実行する必要があります。基本的に、1 つのオブジェクトのすべてのデータ (1 つのオブジェクト - 1 つの行) を表示し、必要のない列を削除/非表示にするだけです。

4

4 に答える 4

2

あなたはそれを平らにすることによってそれをします。オブジェクトのすべての子孫を取得し、それらを要素に変換します。私のコードを受け入れるのではなく、実際にこれを自分で試してみるべきですが、それは機能するので、思いついたものと比較してテストできます。

XElement root1 = XElement.Load(file1);
XElement root = new XElement("ROOT",
    root1.Elements()
        .Select(o => new XElement(o.Name, o
            .Descendants()
            .Select(x =>
            {
                List<XElement> list = new List<XElement>();
                list.Add(new XElement(x.Name, x.HasElements ? "" : x.Value));
                if (x.HasAttributes)
                    list.AddRange(x.Attributes()
                        .Select(a => new XElement(a.Name, a.Value))
                        );
                return list;
            })
            ))
            .ToArray());

PS。<identity></identity>結果セットを忘れました。

于 2012-06-07T14:32:29.823 に答える
2

純粋な XSLT 1.0 ソリューションは次のとおりです。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="OBJECT//*[not(self::identity) and text()]">
  <xsl:copy>
   <xsl:apply-templates select="text()"/>
  </xsl:copy>
  <xsl:apply-templates select="@* | node()[not(self::text())]"/>
 </xsl:template>

 <xsl:template match="OBJECT//*[not(self::identity) and (not(text()))]">
  <xsl:copy/>
  <xsl:apply-templates select="@*"/>
  <xsl:apply-templates select="node()"/>
 </xsl:template>

 <xsl:template match="@*">
  <xsl:element name="{name()}">
   <xsl:value-of select="."/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="identity">
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<ROOT>
    <OBJECT>
        <identity>
            <id>123</id>
        </identity>
        <child2 attr = "aa">32</child2>
        <child3>
            <childOfChild3 att1="aaa" att2="bbb" att3="CCC">LN</childOfChild3>
        </child3>
        <child4>
            <child5>
                <child6>3ddf</child6>
                <child7>
                    <childOfChild7 att31="RR">1231</childOfChild7>
                </child7>
            </child5>
        </child4>
    </OBJECT>
    <OBJECT>
        <identity>
            <id>124</id>
        </identity>
        <child2 attr = "bb">212</child2>
        <child3>
            <childOfChild3 att1="ee" att2="ccc" att3="EREA">OP</childOfChild3>
        </child3>
        <child4>
            <child5>
                <child6>213r</child6>
                <child7>
                    <childOfChild7 att31="EE">1233</childOfChild7>
                </child7>
            </child5>
        </child4>
    </OBJECT>
</ROOT>

必要な正しい結果が生成されます。

<ROOT>
   <OBJECT>
      <id>123</id>
      <child2>32</child2>
      <attr>aa</attr>
      <child3/>
      <childOfChild3>LN</childOfChild3>
      <att1>aaa</att1>
      <att2>bbb</att2>
      <att3>CCC</att3>
      <child4/>
      <child5/>
      <child6>3ddf</child6>
      <child7/>
      <childOfChild7>1231</childOfChild7>
      <att31>RR</att31>
   </OBJECT>
   <OBJECT>
      <id>124</id>
      <child2>212</child2>
      <attr>bb</attr>
      <child3/>
      <childOfChild3>OP</childOfChild3>
      <att1>ee</att1>
      <att2>ccc</att2>
      <att3>EREA</att3>
      <child4/>
      <child5/>
      <child6>213r</child6>
      <child7/>
      <childOfChild7>1233</childOfChild7>
      <att31>EE</att31>
   </OBJECT>
</ROOT>
于 2012-06-08T04:36:18.313 に答える
1

Just use XmlSerializer to deserialize it into a class, here is an msdn post on it, basically you build a class that matches your xml structure and then let the XmlSerializer class do the conversion, you shouldn't need to create your own parser

于 2012-06-07T14:40:04.917 に答える
0

私は C# に詳しくありませんが、これで少なくとも始められることを願っています。XML ファイルを取得し、その情報をデータベースに解析するという、似たようなことをしなければなりませんでした。

Java lib ~ StAXを使用しました。親子システムを使用して、XML ファイルを読み取り、情報を別の XML ファイルに解析することが非常に簡単になります。これが少し役に立てば幸いです。

于 2012-06-07T14:04:20.623 に答える