2016-08-11 18 views
1

私は、を本当にと私は信じていますが、私はVBAを使用してXMLの初心者です。私が見たすべての例では、「シンプルな」XMLと呼ばれるものを使用しています。私の例は(私にとっては)もっと複雑に思えます。 (私はブロック引用符でそれを追加するために管理することができる場合)まず第一に、ここに私のXMLの簡単な抽出物は、VBAを使用してファイルからXML値を抽出してください

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="urn:ec.europa.eu:taxud:tin:services:checkTin" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="urn:ec.europa.eu:taxud:tin:services:checkTin:types" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:ec.europa.eu:taxud:tin:services:checkTin"> 
    <wsdl:types> 
     <xsd:schema xmlns="urn:ec.europa.eu:taxud:tin:services:checkTin:types" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="urn:ec.europa.eu:taxud:tin:services:checkTin:types"> 
     <xsd:element name="checkTin"> 
      <xsd:complexType> 
       <xsd:sequence> 
        <xsd:element name="FR" type="xsd:string" /> 
        <xsd:element name="98-0242041" type="xsd:string" /> 
       </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="checkTinResponse"> 
      <xsd:complexType> 
       <xsd:sequence> 
        <xsd:element name="countryCode" type="xsd:string" /> 
        <xsd:element name="tinNumber" type="xsd:string" /> 
        " 
        <xsd:element name="requestDate" type="xsd:date" /> 
        <xsd:element name="validStructure" type="xsd:boolean" /> 
        <xsd:element name="validSyntax" type="xsd:boolean" minOccurs="0" /> 
       </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     .... multiple elements of <xsd:element name="checkTin"> and <xsd:element > name="checkTinResponse"> then follow 
     ..... 
     </xsd:schema> 
    </wsdl:types> 
    <wsdl:message name="checkTinRequest"> 
     <wsdl:part name="parameters" element="tns1:checkTin" /> 
    </wsdl:message> 
    <wsdl:message name="checkTinResponse"> 
     <wsdl:part name="parameters" element="tns1:checkTinResponse" /> 
    </wsdl:message> 
    <wsdl:portType name="checkTinPortType"> 
     <wsdl:operation name="checkTin"> 
     <wsdl:input name="checkTinRequest" message="impl:checkTinRequest" /> 
     <wsdl:output name="checkTinResponse" message="impl:checkTinResponse" /> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="checkTinBinding" type="impl:checkTinPortType"> 
     <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> 
     <wsdl:operation name="checkTin"> 
     <wsdlsoap:operation soapAction="" /> 
     <wsdl:input name="checkTinRequest"> 
      <wsdlsoap:body use="literal" /> 
     </wsdl:input> 
     <wsdl:output name="checkTinResponse"> 
      <wsdlsoap:body use="literal" /> 
     </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="checkTinService"> 
     <wsdl:port name="checkTinPort" binding="impl:checkTinBinding"> 
     <wsdlsoap:address location="https://ec.europa.eu/taxation_customs/tin/services/checkTinService" /> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

は私がしたい、私が発見し、基本的に以下のコード

Public Sub LoadDocument() 
Dim XDoc As MSXML2.DOMDocument 
Set XDoc = New MSXML2.DOMDocument 
XDoc.validateOnParse = False 
' The file here is basically the same as the XML code above 
If XDoc.Load("E:\Excel\TIN\KVKF440I.txt") Then 
    ' The document loaded successfully. 
    ' Now do something intersting. 
    DisplayNode XDoc.ChildNodes, 0 
Else 
    ' The document failed to load. 
    ' See the previous listing for error information. 
    ' The document failed to load. 
    Dim strErrText As String 
    Dim xPE As MSXML2.IXMLDOMParseError 
    ' Obtain the ParseError object 
    Set xPE = XDoc.parseError 
    With xPE 
     strErrText = "Your XML Document failed to load" & _ 
      "due the following error." & vbCrLf & _ 
     "Error #: " & .ErrorCode & ": " & xPE.reason & _ 
     "Line #: " & .Line & vbCrLf & _ 
     "Line Position: " & .linepos & vbCrLf & _ 
     "Position In File: " & .filepos & vbCrLf & _ 
     "Source Text: " & .srcText & vbCrLf & _ 
     "Document URL: " & .URL 
    End With 

    MsgBox strErrText, vbExclamation 
End If 

Set XDoc = Nothing 

End Sub 

Public Sub DisplayNode(ByRef Nodes As MSXML2.IXMLDOMNodeList, ByVal Indent As Integer) 

    Dim xNode As MSXML2.IXMLDOMNode 
    Indent = Indent + 2 

    For Each xNode In Nodes 
    ' If xNode.NodeType = NODE_TEXT Then 
     If xNode.ParentNode.nodeName = "xsd:element" Then 
     Debug.Print Space$(Indent) & xNode.ParentNode.nodeName & _ 
      ":" & xNode.NodeValue 
     End If 

     If xNode.HasChildNodes Then 
     DisplayNode xNode.ChildNodes, Indent 
     End If 
    Next xNode 
End Sub 

をテストしています各要素名= "checkTin" ' のループ(?)を抽出し、子要素名=' (すなわち、上記の例ではFRと98-0242021を抽出したい)の値を抽出します。 次に、同じことを対応する 'element name = "checkTinResponse"'について同じことを行い、 という5つの要素を抽出したいと考えています。これはxsd:element name = 'です。

私が言ったように、私は多くの例を見つけましたが、明らかに私が何をしているのか分かりません。 たとえば、xNode.ParentNode.nodeName = "xsd:element"のテストの上にあるコピーされたコードは実際には最良の方法ではないと思います。

答えて

2

XPathの式を使用すると、探している要素を取得できます。私は以下のコードで2つのXPath式を使用している

  • //*[local-name()='schema']/*[local-name()='element']

  • ././/*[local-name()='element']

//*[local-name()='schema']/*[local-name()='element']が使用されているschemaノードの下のすべてのelementsを取得します。次に、各要素をループし、XPathという式././/*[local-name()='element']を使用して子を取得しますelements

NB:手順を実行する前に、Microsoft Xml, v6.0への参照を追加してください。

Sub GetElements() 
    Dim xmlFileName As String 
    Dim XDoc As DOMDocument60 
    Dim pElements As IXMLDOMNodeList, pElement As IXMLDOMNode 
    Dim chElements As IXMLDOMNodeList, chElement As IXMLDOMNode 

    xmlFileName = "C:\Temp\test.xml"  ''-- set filename appropriately 
    Set XDoc = New DOMDocument60 
    XDoc.validateOnParse = False 
    If XDoc.Load(xmlFileName) Then 
     ''-- The document loaded successfully. 
     Set pElements = XDoc.SelectNodes("//*[local-name()='schema']/*[local-name()='element']") 
     For Each pElement In pElements 
      ''-- print the parent node 
      Debug.Print pElement.Attributes.getNamedItem("name").NodeValue 
      Set chElements = pElement.SelectNodes("././/*[local-name()='element']") 
      For Each chElement In chElements 
       ''-- print the child nodes 
       Debug.Print vbTab & chElement.Attributes.getNamedItem("name").NodeValue 
      Next 
     Next 
    Else 
     ''-- The document failed to load. 
     MsgBox Err.Number & ":" & Err.Description, vbExclamation, "Error" 
    End If 

    Set XDoc = Nothing 

End Sub 

結果:

checkTin 
    FR 
    98-0242041 
checkTinResponse 
    countryCode 
    tinNumber 
    requestDate 
    validStructure 
    validSyntax 
+1

感謝します。 **私はその解決策にそれを作った**方法はありません。私は今夜​​後で家でテストします。 –

+0

私はこのコードを 'Dim XDoc As MSXML2.DOMDocument'と' Set XDoc = New MSXML2.DOMDocument'に変更しなければなりませんでしたが、 'Set pElements = XDoc.SelectNodes(" // * [local-name() = 'schema']/* [local-name()= 'element'] ")' "Unknown method"というエラーメッセージが表示されます –

+0

解決策が見つかりました[link] http://stackoverflow.com/questions/20617236/unknown-method-in-xpath-run-by-vbscript私はSetPropertyについての行を追加して、うまくいきました。あなたの元の答えの多くのおかげです。 –

関連する問題