2015-09-10 3 views
0

У меня есть XML-файл, который нужно разобрать. Этот файл содержит информацию о подводном погружении. Это довольно просто структурированы:Анализ XML в Excel VBA не находит мой узел

<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> 

Теперь я хочу, чтобы извлечь информацию, как продолжительность, AvgDepth и т.д. Кроме того, мне нужно каждый «Dive.Sample» контейнер в виде строки в листе Excel. Предположим, я хочу поместить продолжительность и AvgDepth в A1 и B1 Sheet1 и все «Dive.Sample» в Sheet2, тогда как каждая строка представляет собой контейнер «Dive.Sample». Мой код 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 

Вопрос заключается в том, что анализатор не находит узел /dive/AvgDepth. xmlKnoten всегда ничего. Что я делаю не так?

Как я могу углубиться в xml-структуру, чтобы получить «Dive.Sample»?

+0

возможный дубликат [Чтение несколько XML-файлов с помощью VB6] (http://stackoverflow.com/questions/26034373/reading-multiple-xml-files-via -vb6) – GSerg

ответ

1

Проблема заключается в множественных пространствах имен и явно не префиксном пространстве имен по умолчанию. Поэтому XPath не знает, какое пространство имен должно использоваться для «/ Dive».

Либо вы используете

... 
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 
... 

или карту по умолчанию пространство имен с префиксом 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 
... 

Для Вашего второго вопроса: «Как я могу получить глубже в XML-структуре получить мой «Dive.Sample»? »

Я хотел бы сделать что-то вроде этого:

... 
Dim xmlNodeList As IXMLDOMNodeList 

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

For Each xmlKnoten In xmlNodeList 
MsgBox xmlKnoten.XML 
Next 
... 
Смежные вопросы