简体   繁体   English

Excel VBA中的XML解析找不到我的节点

[英]XML parsing in Excel VBA doesn't find my node

I have an XML file to be parsed. 我有一个要解析的XML文件。 That file contains information about a scuba dive. 该文件包含有关水肺潜水的信息。 It is pretty simple structured: 它的结构非常简单:

<Dive xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Suunto.Diving.Dal">
   <Algorithm>1</Algorithm>
   <AltitudeMode>0</AltitudeMode>
   <AscentTime i:nil="true"/>
   <AvgDepth>9.36</AvgDepth>
   <Boat i:nil="true"/>
   <BottomTemperature>23</BottomTemperature>
   <BottomTime i:nil="true"/>
   <CnsEnd>1</CnsEnd>
   <CnsStart>0</CnsStart>
   <CylinderVolume>12</CylinderVolume>
   <CylinderWorkPressure>232000</CylinderWorkPressure>
   <Deleted i:nil="true"/>
   <DeltaPressure i:nil="true"/>
   <DesaturationTime i:nil="true"/>
   <DiveMixtures>
      <DiveMixture>
         <DiveGasChanges/>
         <EndPressure>47300</EndPressure> 
         <Helium>0</Helium>
         <Name i:nil="true"/>
         <Oxygen>21</Oxygen>
         <PO2>0</PO2>
         <Size>0</Size>
         <StartPressure>208100</StartPressure>
         <TransmitterId i:nil="true"/>
         <Type>4</Type>
   </DiveMixture>
</DiveMixtures>
<DiveNumberInSerie>2</DiveNumberInSerie>
<DiveSamples>
   <Dive.Sample>
      <AveragedTemperature>26</AveragedTemperature>
      <Ceiling i:nil="true"/>
      <Depth>1.23</Depth>
      <GasTime i:nil="true"/>
      <Heading i:nil="true"/>
      <Pressure>208100</Pressure>
      <SacRate>27.0936737</SacRate>
      <Temperature>26</Temperature>
      <Time>0</Time>
   </Dive.Sample>
   <Dive.Sample>
      <AveragedTemperature>26</AveragedTemperature>
      <Ceiling i:nil="true"/>
      <Depth>3.29</Depth>
      <GasTime i:nil="true"/>
      <Heading i:nil="true"/>
      <Pressure>206800</Pressure>
      <SacRate>28.29174</SacRate>
      <Temperature>26</Temperature>
      <Time>20</Time>
   </Dive.Sample>
</DiveSamples>
<DiveTags/>
<DiveTime i:nil="true"/>
<DivingDaysInRow i:nil="true"/>
<Duration>3595</Duration>
<EndPressure>47300</EndPressure>
<EndTemperature>25</EndTemperature>
</Dive>

Now I want to extract information like duration, AvgDepth etc. Furthermore I need each "Dive.Sample" container as a row in a excel sheet. 现在,我想提取诸如持续时间,AvgDepth等信息。此外,我需要在Excel工作表中将每个“ Dive.Sample”容器作为一行。 Let's say I want to put the duration and AvgDepth in A1 and B1 of Sheet1 and all "Dive.Sample" in Sheet2 whereas each row represents a "Dive.Sample" container. 假设我要将工期和AvgDepth放在Sheet1的A1和B1中,并将所有“ Dive.Sample”放入Sheet2中,而每一行则代表一个“ Dive.Sample”容器。 My VBA code right now looks like this (I am just trying to get AvgDepth): 我的VBA代码现在看起来像这样(我只是想获取AvgDepth):

Dim xmlDoc As New MSXML2.DOMDocument
Dim xmlKnoten As IXMLDOMNode

Dim xpathKnoten As String
Dim xpathAttrib As String

xmlDoc.async = False
xmlDoc.validateOnParse = True                    ' Auf Fehler prüfen

If xmlDoc.Load(XmlDateiMitPfad) = False Then
   MsgBox "XML-Datei: '" & XmlDateiMitPfad & "' wurde nicht gefunden"
   Exit Sub
ElseIf xmlDoc.parseError = True Then
   MsgBox "XML-Datei: '" & XmlDateiMitPfad & "' hat fehlerhaften Aufbau (ist nicht 'wohlgeformt')"
   Exit Sub
End If

xmlDoc.setProperty "SelectionLanguage", "XPath"  

xpathKnoten = "/Dive/AvgDepth"                           
Set xmlKnoten = xmlDoc.SelectSingleNode(xpathKnoten)   

If xmlKnoten Is Nothing Then
     MsgBox "Knoten nicht gefunden. Vermutlich falsche XML-Struktur"
     Exit Sub
End If

With Tabelle1
   .Range("A3") = xmlKnoten.SelectSingleNode("AvgDepth").Text
End With

The issue is that the parser doesn't find the node /dive/AvgDepth . 问题是解析器找不到节点/dive/AvgDepth xmlKnoten is always nothing. xmlKnoten总是一无所有。 What am I doing wrong? 我究竟做错了什么?

How can I get deeper in the xml-structure to get my "Dive.Sample"? 我如何更深入地了解xml结构以获取“ Dive.Sample”?

The problem are the multiple namespaces and the not explicitly prefixed default namespace. 问题在于多个名称空间和未显式添加前缀的默认名称空间。 So XPath don't know which namespace should be used for "/Dive". 因此XPath不知道应将哪个名称空间用于/ Dive。

Either you use 要么你用

...
xpathKnoten = "*[local-name(.) = 'Dive']"
Set xmlKnoten = xmlDoc.SelectSingleNode(xpathKnoten)

If xmlKnoten Is Nothing Then
     MsgBox "Knoten nicht gefunden. Vermutlich falsche XML-Struktur"
     Exit Sub
End If

With Tabelle1
   .Range("A3") = xmlKnoten.SelectSingleNode("*[local-name(.) = 'AvgDepth']").Text
End With
...

or you map the default namespace with a prefix for XPath: 或使用XPath前缀映射默认名称空间:

...
xmlDoc.setProperty "SelectionLanguage", "XPath"

xmlDoc.setProperty "SelectionNamespaces", "xmlns:sdd=""http://schemas.datacontract.org/2004/07/Suunto.Diving.Dal"""

xpathKnoten = "/sdd:Dive"
Set xmlKnoten = xmlDoc.SelectSingleNode(xpathKnoten)

If xmlKnoten Is Nothing Then
     MsgBox "Knoten nicht gefunden. Vermutlich falsche XML-Struktur"
     Exit Sub
End If

With Tabelle1
   .Range("A3") = xmlKnoten.SelectSingleNode("sdd:AvgDepth").Text
End With
...

For your second question: "How can I get deeper in the xml-structure to get my "Dive.Sample"?" 对于第二个问题:“如何深入了解xml结构以获取“ Dive.Sample”?

I would do something like that: 我会做这样的事情:

...
Dim xmlNodeList As IXMLDOMNodeList

Set xmlNodeList = xmlDoc.SelectNodes("/sdd:Dive/sdd:DiveSamples/sdd:Dive.Sample")

For Each xmlKnoten In xmlNodeList
 MsgBox xmlKnoten.XML
Next
...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM