От новичка до гуру: Курсы программирования на CyberDuff

Узел чтения VBA XML, если атрибут = 1, читать другие атрибуты в этом узле. Сделайте то же самое для всех узлов

Я пытаюсь написать сценарий Excel VBA для выборочного получения информации из файла xml и создания таблицы с этой информацией.

Есть тысячи узлов, все дефекты имен, и в каждом дефекте есть атрибуты. Я хочу использовать атрибут в каждом дефекте, чтобы отфильтровать некоторые нежелательные дефекты, и перечислить все остальные атрибуты желаемых дефектов в узлах с именем дефект.

Пожалуйста, смотрите ниже для получения дополнительной информации. nextSibling нельзя использовать.

XML-структура:

<!-- language: xml -->
<?xml version="1.0" encoding="WINDOWS-1252"?>
<CDXML>
<DATA><FaceInformation><Defects>
<Defect>
    <Black Type="Integer" Value="1"/>
    <Dots Type="Integer" Value="21"/>
    <Height Type="Integer" Value="1"/>
</Defect>
<Defect>
    <Black Type="Integer" Value="0"/>
    <Dots Type="Integer" Value="22"/>
    <Height Type="Integer" Value="2"/>
</Defect>
<Defect>
    <Black Type="Integer" Value="1"/>
    <Dots Type="Integer" Value="23"/>
    <Height Type="Integer" Value="3"/>
</Defect>
</Defects></FaceInformation></DATA>

Желаемый результат:

<!-- language: lang-none -->
Black    Dots     Height
1        21       1
1        22       3

VBA:

<!-- language: lang-vb -->
Dim xmlDoc As DOMDocument30
Set xmlDoc = New DOMDocument30
xmlDoc.async = False
Dim n, m As IXMLDOMNode
Dim j As Integer

XMLFileName = C:\1.xml
xmlDoc.Load (XMLFileName)

'This goes through all the attributes with the name Black,
'this is okay since Black only appear once in each node called defect.
For Each n In xmlDoc.SelectNodes("//Defects/Defect/Black")
    'Read value of the Black attribute
    Black = n.Attributes.getNamedItem("Value").Text
    If Black <> "0" Then 'Print if 1
        Cells(j + 3, 2) = Black
        'I can not use nextSibling because the order of defects is not always the same
        For Each m In n.SelectNodes("DefectClass")
            Dots = m.Attributes.getNamedItem("Value").Text
            'I have no idea what to do from this point
            Cells(i + 3, 3) = Dots
        Next
        j = j + 1
    End If
Next
22.09.2015

  • Мне кажется, что некоторые опечатки, такие как XMLFileName = C:\1.xml , должны быть в кавычках "XMLFileName = C:\1.xml ". Далее Dim xmlDoc As DOMDocument30 дает ошибку компилятора в моей системе excel 2007. Если я сделаю это DOMDocument60, это приемлемо. Я просмотрел старые сообщения о переполнении стека и нашел одно из них от @David Zemens, связанное и интересное. to-excel/19118292#19118292" title="как читать атрибуты xml с помощью vba to excel"> stackoverflow.com/questions/19117667/› Взяв подсказки из его программы, я надеюсь, что вы сможете продолжить . 22.09.2015

Ответы:


1

Я думаю, вы могли бы использовать все возможности XMLDOM для выполнения своей задачи. Я не уверен, какую библиотеку вы используете, но я использовал Microsoft XML, v6.0.

  1. убедитесь, что ваш XML правильный. Я думаю, что может отсутствовать закрывающий тег </CDXML>.
  2. убедитесь, что ваше имя файла является строкой при использовании xmlDoc.Load(filename).
  3. Интересно, не смущает ли вас ваша фразеология. Элемент <Defect> не имеет атрибутов. У него есть три дочерних элемента, которые сами имеют атрибуты — и именно эти атрибуты вам нужны.
  4. функция SelectNodes() передает строку запроса, которая может включать фильтр атрибутов, например: "//Black[@Value!=""0""]". Вы можете использовать эту функцию для получения ваших целевых элементов.
  5. если вы не хотите перебирать братьев и сестер, вы можете получить родителя своего узла, а затем выбрать целевые дочерние узлы по имени. К счастью, модель XMLDOM вернет Nothing, а не ошибку, если узлы не найдены, и, очевидно, ее не волнует порядок расположения узлов, они просто должны быть потомками родителя. Таким образом, вы можете просто проверить, что все ваши атрибуты не являются Nothing, а затем записать значения на лист Excel.

Таким образом, ваш код может выглядеть примерно так:

Dim xmlFileName As String
Dim xmlDoc As DOMDocument
Dim nodeList As IXMLDOMNodeList
Dim node As IXMLDOMNode
Dim query As String
Dim black As IXMLDOMAttribute
Dim dots As IXMLDOMAttribute
Dim height As IXMLDOMAttribute
Dim rng As Range

Set xmlDoc = New DOMDocument30
xmlDoc.async = False

xmlFileName = "C:\1.xml"
query = "//Black[@Value!=""0""]"

xmlDoc.Load (xmlFileName)
Set nodeList = xmlDoc.SelectNodes(query)

If Not nodeList Is Nothing Then
    Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1").Resize(, 3)
    rng.Value = Array("Black", "Dots", "Height")
    Set rng = rng.Offset(1)

    For Each node In nodeList
        Set black = node.Attributes.getNamedItem("Value")
        Set dots = node.ParentNode.SelectSingleNode("Dots").Attributes.getNamedItem("Value")
        Set height = node.ParentNode.SelectSingleNode("Height").Attributes.getNamedItem("Value")

        If Not black Is Nothing And Not dots Is Nothing And Not height Is Nothing Then
            rng.Value = Array(black.Text, dots.Text, height.Text)
            Set rng = rng.Offset(1)
        End If
    Next
Else
    MsgBox "No elements found using the query: " & query
End If
22.09.2015
  • Спасибо за ваших пациентов, в информации, которую я дал, много ошибок. Я многому научился благодаря этому. 22.09.2015
  • Новые материалы

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..

    Игра в прятки с данными
    Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

    «Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
    TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..

    Раскройте свой потенциал в области разработки мобильных приложений: Абсолютная бесплатная серия
    Глава 6: Работа в сети и выборка данных Глава 1: Введение в React Native Глава 2: Основы React Native Глава 3: Создание пользовательского интерфейса с помощью React Native Глава 4:..

    Все о кейсах: Camel, Snake, Kebab & Pascal
    В программировании вы сталкивались с ними при именовании переменной, класса или функции. Поддержание согласованности типов и стилей случаев делает ваш код более читабельным и облегчает совместную..