2016-08-09 44 views
1

Ich bin ein Neuling in VBScript und XML-Codierung.Allerdings, meinen Kopf herum und versuchen, die Konzepte von W3 Schulen und anderen Online-Foren zu verstehen.Importieren von XML-Inhalten nach Excel

Ich möchte eine XML-Datei mit VBScript lesen/analysieren, meine XML-Datei ist nicht Daten, sondern XML-Quellcode aus einer Anwendung.

Unten ist der Code-Snippet, das ich verwende -

Sub LoadXMLFile() 

Dim objXML  'for xml document 
Dim objNode 'for xml node item 
Dim i As Integer 
i = 0 

Set objXML = CreateObject("Microsoft.XMLDOM") 
objXML.Load ("C:\path\test.xml") 
objXML.setProperty "SelectionLanguage", "XPath" 
Set objNode = objXML.SelectNodes("/report/queries/query/selection/dataItem/text()") 
'MsgBox objNode.Text 

For i = 0 To (objNode.Length - 1) 
NodeVal = objNode(i).NodeValue 
MsgBox NodeVal 
Next 

End Sub 

Wenn ich durch den VB-Code Schritt immer der objNode.Length Wert auf 0 Nicht sicher auswertet, warum die nicht die Länge zu berechnen. Hier

ist die xml, die ich zu analysieren, ich versuche -

<report xmlns="http://developer.cognos.com/schemas/report/10.0/" useStyleVersion="10" expressionLocale="en-us"> 
<modelPath> 
/content/package[@name='GO Sales (query)']/model[@name='model'] 
</modelPath> 
<drillBehavior/> 
<queries> 
<query name="Query1"> 
<source> 
<model/> 
</source> 
<selection> 
<dataItem aggregate="none" rollupAggregate="none" name="Product line"> 
<expression>[Sales (query)].[Products].[Product line]</expression> 
<XMLAttributes> 
<XMLAttribute output="no" name="RS_dataType" value="3"/> 
<XMLAttribute output="no" name="RS_dataUsage" value="attribute"/> 
</XMLAttributes> 
</dataItem> 
<dataItem aggregate="none" rollupAggregate="none" name="Product type"> 
<expression>[Sales (query)].[Products].[Product type]</expression> 
<XMLAttributes> 
<XMLAttribute output="no" name="RS_dataType" value="3"/> 
<XMLAttribute output="no" name="RS_dataUsage" value="attribute"/> 
</XMLAttributes> 
</dataItem> 
</selection> 
</query> 
</queries> 
</report> 

Schätzen Sie Ihre Zeit und Antwort.

Dank & Grüße Raj

+0

Vielleicht passt Ihr XPATH nicht zu etwas. Ob dies der Fall ist oder nicht, können wir nur feststellen, wenn wir das XML sehen. Bitte zeigen Sie Ihre XML an. –

+0

Danke für Ihre Antwort @AxelRichter. Ich habe den obigen Beispiel-XML-Code eingefügt. – Raj

+0

Wenn Sie Ihre XML wie folgt ändern, wird "text()" nicht mehr leer sein: ' blabla (nur ein dummes Beispiel) – Dominique

Antwort

1

Das erste Problem ist, dass das dataItem Element keinen Textknoten als direkter Kindknoten hat. So wird ...dataItem/text() Null zurückgeben. Das Element dataItem enthält die Elementknoten expression und XMLAttributes. Die expression enthält einen Textknoten. Die XMLAttributes enthält weitere untergeordnete Knoten.

Wir können durch alle diese Knoten iterieren, wenn die dataItem Elemente gefunden werden. Oder wir können den gesamten Textinhalt aus allen Childnodes holen. Was wir mit XML-DOM-Objekten tun können, wird unter XML DOM Objects/Interfaces

beschrieben. Das zweite Problem besteht darin, dass in Ihrem XML ein Namespace definiert ist. Dies benötigt der XML-Parser. Ist dies nicht der Fall, nimmt der Parser alle Elemente außerhalb von Namespaces an und findet daher nicht alle Elemente innerhalb von Namespaces.

Sub LoadXMLFile() 

Dim objXML   'for xml document 
Dim objNodeList 'for xml node lists 
Dim objNode  'for xml node 
Dim oAttribute  'for xml attribute 
Dim oChildNode  'for xml node 
Dim oSubChildNode 'for xml node 

Set objXML = CreateObject("Microsoft.XMLDOM") 
objXML.Load ("C:\Users\Axel Richter\Desktop\test.xml") 
objXML.setProperty "SelectionLanguage", "XPath" 
objXML.setProperty "SelectionNamespaces", "xmlns:dcc=""http://developer.cognos.com/schemas/report/10.0/""" 

Set objNodeList = objXML.SelectNodes("/dcc:report/dcc:queries/dcc:query/dcc:selection/dcc:dataItem") 

For Each objNode In objNodeList 
MsgBox objNode.Text 'the text content in this element and its child elements 

'go through all attributes 
For Each oAttribute In objNode.Attributes 
    MsgBox oAttribute.Name & ": " & oAttribute.Text 
Next 

'go through all child nodes 
For Each oChildNode In objNode.ChildNodes 
    'if the child node has child b´nodes of its own, go through them too 
    If oChildNode.HasChildNodes Then 
    For Each oSubChildNode In oChildNode.ChildNodes 
    MsgBox oSubChildNode.nodeName & ": " & oSubChildNode.XML 
    Next 
    Else 
    MsgBox oChildNode.nodeName & ": " & oChildNode.Text 
    End If 
Next 

Next 

End Sub 

Mit

objXML.setProperty "SelectionNamespaces", "xmlns:dcc=""http://developer.cognos.com/schemas/report/10.0/"""

ich ein Präfix dcc für den Namespace

http://developer.cognos.com/schemas/report/10.0/ definieren:

So mit Ihrem XML könnten Sie Folgendes tun.

Die dcc ist meine eigene Wahl (d eveloper c ognos c om). Dieses Präfix wird benötigt, damit XPATH in selectNodes Method ordnungsgemäß funktioniert. Da sich alle Elemente in Ihrem XML in diesem Namespace befinden, weil das Stammelement report über dieses Attribut xmlns verfügt, muss XPATH alle untergeordneten Elemente von report aus diesem Namespace auswählen. Sonst wird es nicht funktionieren. Das Präfix dcc wird also für alle Elemente in XPATH-selects benötigt, die sich in diesem Namensraum befinden. Wenn mehr als ein Namespace vorhanden ist, sind mehrere Präfixe erforderlich. Eine für jeden Namespace.

Dies ist eine der genauen Arbeitsbedingungen von XPATH. Die getElement... Methoden sind toleranter mit diesen Namespaces. Aber der Namespace ist da und sollte respektiert werden.

+0

Danke @AxelRichter, funktioniert wie ein charm.its nur ein paar Tage habe ich angefangen zu lernen xml und vbscript, ich versuche zu verstehen, die Logik und die Schlüsselwörter, die Sie verwendet haben. Ich gehe durch - https://msdn.microsoft.com/en-us/library/windows/desktop/ms757878(v=vs.85).aspx und versuche, diese Eigenschaften zu verwenden. Auch was bedeutet das: dcc bedeutet, und ich muss das in der SelectNodes-Eigenschaft jedes Mal verwenden, wenn ich durch den Knoten traversiere. Vielen Dank für Ihre Zeit. – Raj

+0

@Raj: Siehe meine Ergänzung. –

+0

Danke @AxelRichter, dein Code-Snippet hat die Richtung vorgegeben und ich mache gute Fortschritte mit dem Code. Ich bin dabei, einige weltliche Dinge zu automatisieren, die viel Zeit brauchen. – Raj