Получение значений частичных элементов - PullRequest
1 голос
/ 01 октября 2019

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

Это в VBS и используется как расширение в ужеДействующая программа. Просматривал здесь и документацию Microsoft, но у меня возникают проблемы с получением от них хорошей информации, в частности, для VBS.

Пример XML

<Detail>
 <StandardLine>
  <Stan>
   <Type>A</Type>
   <Code>1234</Code>
   <Value>sdg</Value>
  </Stan>
 </StandardLine>
 <StandardLine>
  <Stan>
   <Type>C</Type>
   <Code>122234</Code>
   <Value>sdsdgg</Value>
   <Cate>Thiere</Cate>
  </Stan>
 </StandardLine>
 <StandardLine>
  <Stan>
   <Type>1</Type>
   <Code>7336</Code>
   <Value>this one</Value>
   <Stone>diamond</Stone>
  </Stan>
 </StandardLine>
</Detail>
Dim xmlDoc, nodes, strQuery, objNode
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.Async = "False"
'This is inputing the xml as a string from a previous bit of code
xmlDoc.loadXML(XMLOut)

strQuery = "//Detail/StandardLine"
Set nodes = xmlDoc.documentElement.selectNodes(strQuery)

'Check to see if this xmlDoc has any of the desired SL nodes
If nodes.length = 0 Then
    msgbox "There are no SLine nodes",,"The checker"
    exit function
End If  

'Will only get this far if there is a SLine node
msgbox "Before Nodes" & vbCrLf & nodes.length,,"Pre loop"

' Will go through each SLinenodes
For Each objNode in nodes
    msgbox "I am in the loop!",,"The box...in the loop"

'Here down is what I want to do but am not able to get it to work
        'Need to to process the SLine node
    Type = objNode.documentElement.selectSingleNode("//Stan/Type").text

    If Type = 1 Then
       Code = objNode.documentElement.selectSingleNode("//Stan/Code").text
    End if

'Will be functions here later to use the variable Code

        msgbox "Number is: " & Code,,"Thereas the number?"
Next
msgbox "After Nodes",,"Post loop"

Я хочу извлечь из приведенного выше XMLзначение в элементе, если значение элемента равно 1.

Редактировать: исправлено неуместное '/' в примере xml

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Я думаю, что ваш XPath для получения Type and Code был неверным. Попробуйте следующее:

Private Sub Parse(p_sXML)
    Dim xmldoc
    Dim objNodes
    Dim objNode
    Dim sQuery
    Dim sType
    Dim sCode

    Set xmldoc = CreateObject("MSXML2.DOMDocument.6.0")

    xmldoc.Async = False

    ' This is inputing the xml as a string from a previous bit of code
    xmldoc.loadXML p_sXML

    sQuery = "//Detail/StandardLine"
    Set objNodes = xmldoc.documentElement.selectNodes(sQuery)

    ' Check to see if this xmlDoc has any of the desired SL nodes
    If objNodes.length = 0 Then
        MsgBox "There are no SLine nodes", , "The checker"
        Exit Sub
    End If

    ' Will go through each nodes
    For Each objNode In objNodes

        ' Get Type element
        sType = objNode.selectSingleNode("Stan/Type").Text

        If sType = "1" Then
           sCode = objNode.selectSingleNode("Stan/Code").Text
        End If

        ' Will be functions here later to use the variable Code

    Next

End Sub
0 голосов
/ 02 октября 2019

Я смог заставить его работать, собрав нужные мне узлы с помощью

xmlDoc.documentElement.selectNodes(strQuery)

Затем зацикливая те, которые были для каждого цикла. Для этого я создал дополнительную функцию, которую передал objNode.xml, и создал дополнительный временный xmlDOM, а затем обнаружил, была ли там нужная мне строка и, если это так, вытащил ее.

Function ProcessXML(strXMl)
    Dim xmlDoc,strQT, strQC,type,code, ty
    Set xmlDoc = CreateObject("Microsoft.XMLDOM")
    xmlDoc.Async = "False"
    xmlDoc.loadXML(strXML)

    strQT = "//StandardLine/Stan/Type"
    strQC = "//StandardLine/Stan/Code"

    set ty = xmlDoc.documentElement.selectSingleNode(strQT)

    if not(ty is nothing) then
       type = ty.text
    else
       type = -1
    end if

    if type = 1 then
       code = xmlDoc.documentElement.selectSingleNode(strQC).text
    else
       Code = -1
    end if

    ProcessXML = Code
End Function

Dim xmlDoc, nodes, strQuery, objNode
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.Async = "False"
'This is inputing the xml as a string from a previous bit of code
xmlDoc.loadXML(XMLOut)

strQuery = "//Detail/StandardLine"
Set nodes = xmlDoc.documentElement.selectNodes(strQuery)

'Check to see if this xmlDoc has any of the desired SL nodes
If nodes.length = 0 Then
    msgbox "There are no SLine nodes",,"The checker"
    exit function
End If  

'Will only get this far if there is a SLine node
msgbox "Before Nodes" & vbCrLf & nodes.length,,"Pre loop"

' Will go through each SLinenodes
For Each objNode in nodes
    Dim Code
    msgbox "I am in the loop!",,"The box...in the loop"

    Code = ProcessXML(objNode.xml)

'Will be functions here later to use the variable Code

        msgbox "Number is: " & Code,,"Thereas the number?"
Next
msgbox "After Nodes",,"Post loop"

Проблема Iбыло до того, как я пытался использовать методы выбора для того, что было элементом IXMLDOME, которые я думаю из IXMLDOMDocuments. Чтобы обойти это, я создал новые IXMLDOMDocuments из IXMLDOMElements. Это то, что я думаю. ИДК, если это только я, но получить документацию по VBS для этого было сложно, как f. Я получал фрагменты кода javascript или c ++ из документации Microsoft и не смог найти таблицу, показывающую методы для элементов IXMLDOME.

...