2016-11-11 39 views
0

コンテキスト例のXMLファイルで抽出XMLは、VBAで名前をノード

、いくつかのデータは次の形式で次のようになります。

<A1> 
    <B1> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B1> 
    <B2> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B2> 
</A1> 
<A2> 
    <B1> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B1> 
    <B2> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B2> 
</A2> 

私は繰り返す必要

私の質問次の結果を得る:

A1B1C1 
A1B1C2 
A1B1C3 
A1B2C1 
A1B2C2 
A1B2C3 

私は何度も試してみましたが、この結果を得ることができませんでした。

+1

あなたはVBAでXML文書を解析しようとしていると私はあなたがあなたの前にでこぼこ道を持っていると言わなければならない。これが唯一の希望基準の値を抽出するコードであり、あなたは[このトピック](http://stackoverflow.com/questions/11305/how-to-parse-xml-using-vba)と[this one](http://stackoverflow.com/)を見ることができます。質問/ 21491736/XMLファイルの読み書き方法とデータ保存方法)。 VBAでXMLを解析するのは悪夢であり、XPathも見ようとしますが、これを簡単に行う方法はありません。 –

+0

あなたはVBAでできないことを意味しますか? – user2155454

+0

明らかに私が提供したリンクは開かなかったが、とにかく説明する。そうすることはできますが、非常に難しく、[XPathのリンクをクリックする](https://msdn.microsoft.com/en-us/library/ms256086)のように、あらゆる種類のライブラリとツールを使用する必要があります。 (v = 1.10).aspx)。あなたの投稿が削除される可能性が高いので、回答を探してみてください。 –

答えて

2

最初に、 "Microsoft XML、vx.x"というライブラリを使用することをお勧めします。ここで、xは最新のバージョンです(6.0にする必要があります)。その後、あなたは行くのが良いです。しかし、VBAでXMLを扱う際に考慮すべきことは、答えには広範囲に及ぶことです。でも、私はあなたの所望の出力を得るためにここにコードを提供します:

Sub parse_xml() 

    Dim XmlFileName As String: XmlFileName = "C:\Path\Filename.xml" 
    Dim XmlDocument As New MSXML2.DOMDocument60 
    Dim NodeA As IXMLDOMNode 
    Dim NodeB As IXMLDOMNode 
    Dim NodeC As IXMLDOMNode 

    XmlDocument.Load XmlFileName 

    For Each NodeA In XmlDocument.DocumentElement.ChildNodes 
     For Each NodeB In NodeA.ChildNodes 
      For Each NodeC In NodeB.ChildNodes 
       Debug.Print NodeC.ParentNode.ParentNode.BaseName & NodeC.ParentNode.BaseName & NodeC.BaseName 
      Next NodeC 
     Next NodeB 
    Next NodeA 

End Sub 

は、私はそれをXmlDocument変数にロードすることができ、有効なXML-ファイルにするために、あなたのファイルを少し拡大しなければならなかったことに注意してください。 (あなたが見ることができるように私だけを使用します。Debug.Print)

<?xml version="1.0" encoding="UTF-8"?> 
<data> 
    <A1> 
    <B1> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B1> 
    <B2> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
     </B2> 
    </A1> 
    <A2> 
    <B1> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B1> 
    <B2> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
     </B2> 
    </A2> 
</data> 

これは、次のような出力を生成します:次されて、私はこの例のために使用されるXMLファイル

A1B1c2 
A1B1c3 
A1B2c1 
A1B2c2 
A1B2c3 
A2B1c1 
A2B1c2 
A2B1c3 
A2B2c1 
A2B2c2 
A2B2c3 

サイドノートでend:ピエールのコメントとは違って、私はVBAでのXMLの解析は達成可能な作業だと思う。私の経験から、ファイルの実際の解析を行うには、投稿の一番上にあるライブラリをお勧めします。私は、かなり複雑なXML-Filesを解析するためにそのライブラリだけを使って作業しました。

編集:

Sub parse_xml() 

    Dim XmlFileName As String: XmlFileName = "C:\Path\Filename.xml" 
    Dim XmlDocument As New MSXML2.DOMDocument60 
    Dim NodeA As IXMLDOMNode 
    Dim NodeB As IXMLDOMNode 
    Dim NodeC As IXMLDOMNode 

    Dim DesiredA As String: DesiredA = "A2" 'Enter your desired A here 

    XmlDocument.Load XmlFileName 

    For Each NodeA In XmlDocument.DocumentElement.ChildNodes 
     If NodeA.BaseName = DesiredA Then 'This is the new line that selects your desired A 
      For Each NodeB In NodeA.ChildNodes 
       For Each NodeC In NodeB.ChildNodes 
        Debug.Print NodeC.ParentNode.ParentNode.BaseName & NodeC.ParentNode.BaseName & NodeC.BaseName 
       Next NodeC 
      Next NodeB 
     End If 'End of the If-Statement 
    Next NodeA 

End Sub 
+0

ありがとう、もう一つの必要条件があります。 私は、特定の 'A'の 'B'と 'C'の値を見つける必要があります。私はA1、A2、....... A1000を持っていると仮定しますこの場合、私は特定のA iのデータを取得する必要があります。電子A99 データが A99B1C1 A99B1C2 A99B1C3 A99B2C1 A99B2C2 A99B2C3 する必要がありますが、それは、VBAで可能ですか?おかげ – user2155454

+0

はい、それはであり、それは非常に簡単です!それがあなたと大丈夫なら、私はそれに応じて数時間で私の答えを編集します。私の答えを正しいものにすることができれば素晴らしいでしょう! –

+0

私はちょうど答えを編集しました。これは速かったので、あなたがしたいことを願っています。私のマシンでそれをテストし、正常に動作します。乾杯! –

関連する問題