2016-11-11 3 views
0

КонтекстИзвлечение XML узлов имен в VBA

В примере файла Xml, некоторые данные будут в следующем формате:

<A1> 
    <B1> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B1> 
    <B2> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B2> 
</A1> 
<A2> 
    <B1> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B1> 
    <B2> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B2> 
</A2> 

Мой вопрос

мне нужно итерируем для получения следующего результата:

A1B1C1 
A1B1C2 
A1B1C3 
A1B2C1 
A1B2C2 
A1B2C3 

Я пробовал много раз, но не смог получить этот результат, может ли кто-нибудь помочь мне с этой благодарностью.

+1

Вы пытаетесь разобрать документ XML в VBA, и я должен сказать, у вас есть ухабистая дорога впереди вас , вы можете посмотреть [эту тему] (http://stackoverflow.com/questions/11305/how-to-parse-xml-using-vba) и [этот] (http://stackoverflow.com/ вопросы/21491736/как к синтаксическому-ан-XML-файл и запись-в-данных, то сохранение этого). Анализ XML в VBA кошмарный, попробуйте взглянуть на XPath также, но нет практического пути к этому легко. –

+0

У вас означает, что мы не можем делать в VBA ??? – user2155454

+0

Видимо, вы не открыли ссылки, которые я предоставил, но я вам все равно объясню. Вы можете, но это чрезвычайно сложно, и вам придется использовать всевозможные библиотеки и инструменты для этого, например [XPath щелкните по ссылке] (https://msdn.microsoft.com/en-us/library/ms256086 (v = vs.110) .aspx). Попытайтесь начать поиск ответов и сообщите нам что-нибудь, чтобы пожевать, иначе ваше сообщение скорее всего будет удалено. –

ответ

2

Сначала я бы рекомендовал использовать библиотеку «Microsoft XML, vx.x», где x обозначает самую новую версию, доступную вам (должна быть 6.0). После этого вы хорошо пойдете. Но то, что следует учитывать при работе с XML в VBA, должно быть широким, чтобы покрыть ответ. Я приведу код здесь, чтобы получить желаемый результат, хотя:

Sub parse_xml() 

    Dim XmlFileName As String: XmlFileName = "C:\Path\Filename.xml" 
    Dim XmlDocument As New MSXML2.DOMDocument60 
    Dim NodeA As IXMLDOMNode 
    Dim NodeB As IXMLDOMNode 
    Dim NodeC As IXMLDOMNode 

    XmlDocument.Load XmlFileName 

    For Each NodeA In XmlDocument.DocumentElement.ChildNodes 
     For Each NodeB In NodeA.ChildNodes 
      For Each NodeC In NodeB.ChildNodes 
       Debug.Print NodeC.ParentNode.ParentNode.BaseName & NodeC.ParentNode.BaseName & NodeC.BaseName 
      Next NodeC 
     Next NodeB 
    Next NodeA 

End Sub 

Пожалуйста, обратите внимание, что я должен был расширить свой файл немного, чтобы сделать это правильный XML-файл, который может быть загружен в переменную XmlDocument , Xml-файл я использовал для этого примера заключается в следующем:

<?xml version="1.0" encoding="UTF-8"?> 
<data> 
    <A1> 
    <B1> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B1> 
    <B2> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
     </B2> 
    </A1> 
    <A2> 
    <B1> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
    </B1> 
    <B2> 
     <c1>value</c1> 
     <c2>value</c2> 
     <c3>value</c3> 
     </B2> 
    </A2> 
</data> 

Это сгенерирует следующий вывод (я использовал только Debug.Print как вы можете видеть):

A1B1c2 
A1B1c3 
A1B2c1 
A1B2c2 
A1B2c3 
A2B1c1 
A2B1c2 
A2B1c3 
A2B2c1 
A2B2c2 
A2B2c3 

Боковой примечание в end: В отличие от того, что прокомментировал Пьер, я думаю, что синтаксический анализ XML в VBA - вполне достижимая задача. По моему опыту вам нужна только библиотека, которую я рекомендовал в верхней части сообщения, чтобы выполнить фактический синтаксический разбор файла. Я работал с довольно сложными XML-файлами, используя только эту библиотеку для синтаксического анализа.

Edit: Это код, который будет только извлечь значения для нужного критерия:

Sub parse_xml() 

    Dim XmlFileName As String: XmlFileName = "C:\Path\Filename.xml" 
    Dim XmlDocument As New MSXML2.DOMDocument60 
    Dim NodeA As IXMLDOMNode 
    Dim NodeB As IXMLDOMNode 
    Dim NodeC As IXMLDOMNode 

    Dim DesiredA As String: DesiredA = "A2" 'Enter your desired A here 

    XmlDocument.Load XmlFileName 

    For Each NodeA In XmlDocument.DocumentElement.ChildNodes 
     If NodeA.BaseName = DesiredA Then 'This is the new line that selects your desired A 
      For Each NodeB In NodeA.ChildNodes 
       For Each NodeC In NodeB.ChildNodes 
        Debug.Print NodeC.ParentNode.ParentNode.BaseName & NodeC.ParentNode.BaseName & NodeC.BaseName 
       Next NodeC 
      Next NodeB 
     End If 'End of the If-Statement 
    Next NodeA 

End Sub 
+0

Спасибо, у меня есть еще одно требование. Мне нужно найти значения «B» и «C» для конкретного «A». Это означает, что у меня есть A1, A2, ....... A1000, в в этом случае мне нужно получить данные конкретного A i.е A99 Данные должны быть A99B1C1 A99B1C2 A99B1C3 A99B2C1 A99B2C2 A99B2C3 Можно ли в VBA? Спасибо – user2155454

+0

Да это и это довольно просто! Я отредактирую свой ответ соответственно через несколько часов, если с тобой все в порядке. Было бы здорово, если бы вы могли отметить мой ответ как правильный! –

+0

Хорошо, я только что отредактировал ответ. Сделал это быстро, поэтому я надеюсь, что он делает то, что вы хотели этого сделать. Протестировал его на моей машине, и он отлично работает. Ура! –

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