2017-01-05 3 views
0

У меня есть следующий XML-файл, в котором я хочу извлечь определенные атрибуты XML, а затем поместить эти атрибуты в файл excel.Извлечение нескольких атрибутов XML в Excel

Ниже мой XML-файл

<?xml version="1.0"?> 
<RECIPE xmlns="x-schema:recipe_schema.xml" Format="1.0" Name="Table1> 
<STEP ChLocation="CH1"/> 
<ENDPOINT/><ENDP_DEVICE Type=""/> 
<PARAMS_STEP> 
<REGULAR> 
<PARAM Alias="Offset1" Name="Offset_1" Value="0"/> 
<PARAM Alias="Offset2" Name="Offset_2" Value="-3.59"/> 
<PARAM Alias="Offset3" Name="Offset_3" Value="0" /> 
<PARAM Alias="Offset4" Name="Offset_4" Value="5.56"/> 
<PARAM Alias="Offset5" Name="Offset_5" Value="0"/> 
<PARAM Alias="Offset6" Name="Offset_6" Value="-3.25"/> 
<PARAM Alias="Offset7" Name="Offset_7" Value="4.66"/> 

Мой код ниже находит все атрибуты узлов (0) и (2) - и это здорово. Я могу debug.print в ближайшее окно.

Проблема возникает, когда я пытаюсь экспортировать их в excel. У меня нет проблемы с извлечением атрибута (0), потому что имя строки является постоянным. Однако я не знаю, как извлечь атрибут (2), потому что значение будет изменяться на регулярной основе, поэтому я не могу напрямую ссылаться на значение.

Я пытался исследовать, как сохранить атрибут (2) в качестве переменной, а затем вызвать эту переменную, но все, что я мог найти, это информация о переменной XSLT, и я не был уверен в синтаксисе VBA, чтобы заставить это работать. Я уже несколько дней занимаюсь исследованиями, но не могу понять. Все, что я вижу в Интернете, касается буквальной ценности.

Я хотел бы экспортировать атрибут (0) и связанный с ним атрибут (2) в таблицу excel. Колонка 1 = Attribute (0) = OffsetX и Колонна 2 = Attribute (0) = Valuex

Что является лучшим способом для извлечения и экспорта атрибутов (2), чтобы преуспеть, так как я не могу сразу назвать значение?

Благодарим за любую помощь заранее - я действительно ценю это.

VBA код ниже

Sub GetOffsetName_And_Values() 

Dim GetOffsets As ThisWorkbook 
Dim objXML As MSXML2.DOMDocument60 
Set objXML = New MSXML2.DOMDocument60 
Dim xmlNodeList As MSXML2.IXMLDOMNodeList 
Dim xmlNode As MSXML2.IXMLDOMNode 


Dim strXML As String 
Dim x As IXMLDOMNode 

objXML.validateOnParse = False 
strXML = "L:\Recipe\File.xml" 

objXML.Load (strXML) 

Set xmlNodeList = objXML.getElementsByTagName("*") 
On Error Resume Next 
For Each xmlNode In xmlNodeList 
    Debug.Print xmlNode.Attributes(0).Text 
    Debug.Print xmlNode.Attributes(2).Text 

Next xmlNode 

If xmlNode.Attributes(0) = "Offset1" Then ThisWorkbook.Sheets("Sheet2").Range("A2") = "Offset1" 
If xmlNode.Attributes(0) = "Offset2" Then ThisWorkbook.Sheets("Sheet2").Range("A3") = "Offset2" 
If xmlNode.Attributes(0) = "Offset3" Then ThisWorkbook.Sheets("Sheet2").Range("A4") = "Offset3" 
If xmlNode.Attributes(0) = "Offset4" Then ThisWorkbook.Sheets("Sheet2").Range("A5") = "Offset4" 
If xmlNode.Attributes(0) = "Offset6" Then ThisWorkbook.Sheets("Sheet2").Range("A6") = "Offset6" 
If xmlNode.Attributes(0) = "Offset7" Then ThisWorkbook.Sheets("Sheet2").Range("A7") = "Offset7" 


Set objXML = Nothing 

End Sub 
+0

* потому что значение будет меняться на регулярной основе * ... номер значения сам или имя ** Значение ** изменится? – Parfait

+0

Не связанный с вопросом, но подумайте о замене всех этих операторов 'IF' на эту единственную строку:' ThisWorkbook.Sheets («Sheet2»). Range («A» & Right (xmlNode.Attributes (0) », 1) .Value = xmlNode. Атрибуты (0) .Text' –

+0

Число меняется. Например, сейчас Alias ​​= «Offset1» и Value = «0», но число меняется каждую неделю, поэтому на следующей неделе это может быть Alias ​​= «Offset1» и Value = «2.5». – mplh2008

ответ

0

Так что я сделал некоторые исследования более, и я был в состоянии получить все атрибуты мне нужно напечатать, чтобы преуспеть в двух столбцах. Код по-прежнему нуждается в настройке, но в целом это работает.

Sub GetOffsetName_And_Values2() 

Dim GetOffsets As ThisWorkbook 
Dim objXML As MSXML2.DOMDocument60 
Set objXML = New MSXML2.DOMDocument60 
Dim xmlNodeList As MSXML2.IXMLDOMNodeList 
Dim xmlNode As MSXML2.IXMLDOMNode 
Dim i As Integer 
Dim strXML As String 

objXML.validateOnParse = False 
strXML = "L:\Recipe\File.xml" 

objXML.Load (strXML) 


Set xmlNodeList = objXML.getElementsByTagName("*") 
On Error Resume Next 
For Each xmlNode In xmlNodeList 

i = i + 1 
     'Debug.Print xmlNode.Attributes(0).NodeValue 
     'Debug.Print xmlNode.Attributes(2).NodeValue 


     With ThisWorkbook.Sheets("Sheet2").Rows(i) 
      .Cells(1).Value = xmlNode.Attributes(0).NodeValue 
      .Cells(2).Value = xmlNode.Attributes(2).NodeValue 
     End With 

Next xmlNode 
Set objXML = Nothing 

End Sub 
+0

Кто-нибудь знает способ изменения вышеупомянутый код, чтобы иметь возможность пройти несколько атрибутов из 4 разных файлов? – mplh2008

+0

Мне нужно учитывать objXML.Load из 4 разных XML-файлов одновременно. 'code'' objXML.Load (strXML), objXML.Load (strXML2), objXML.Load (strXML3), objXML.Load (strXML4) 'Прямо сейчас код соответствует, но он только помещает атрибуты из последнего файла в excel , он в основном перезаписывает другие 3 файла атрибутов, поскольку он проходит через код.Я хотел бы, чтобы атрибуты (0) и (2) из ​​всех 4 файлов вводились в столбцы с 1 по 8. Я думал, что это будет легкая настройка кода, но у меня были проблемы с ним. – mplh2008

Смежные вопросы