Частичное совпадение строк с использованием XPath - PullRequest
0 голосов
/ 03 мая 2018

Я работаю над сценарием VBA для получения данных из XML-документа. Мне нужна помощь, чтобы изменить мой код XPath для поиска частичной строки вместо всей. Это мое текущее выражение:

xmlhttpResponse.SelectNodes("/CharacteristicList/Characteristic[Name='ZCOMP_A_03']
                        /ComplexValueList/ValueItem/Value").Item(0).text

То, что я хотел бы сделать, это что-то вроде [Name='ZCOMP_A_'], но, похоже, он не существует и не работает так. Я видел несколько кодов с начальными символами и содержит, но я хотел бы использовать XPath, похожий на уже использованный (если это возможно).

Это часть кода XML.

<CharacteristicList>
   <Characteristic>
      <Name>ZCOMP_A_03</Name>
      <ValueList>
         <ValueItem>
            <Value>10.50</Value>

Обновление 1! Я сделал некоторые изменения в соответствии с kjhughes, но я получаю ошибку «Неизвестный метод». Это обновленный код:

Dim xmlhttpRequest As New MSXML2.xmlhttp
Dim xmlhttpResponse As New MSXML2.DOMDocument
xmlhttpResponse.setProperty "SelectionLanguage", "XPath"

  Envelope = Envelope & "</soapenv:Envelope>"


  xmlhttpRequest.Open "POST", "http://website.xyz"
  xmlhttpRequest.setRequestHeader "Content-Type", "text/xml;charset=UTF-8"
  xmlhttpRequest.setRequestHeader "SOAPAction", "http://website2.xyz"

  xmlhttpRequest.send Envelope

  Set xmlhttpResponse = xmlhttpRequest.responseXML
  'Lenght_1 = xmlhttpResponse.SelectNodes("//Characteristic[Name='ZCOMP_A_03']/ComplexValueList/ValueItem/Value").Item(0).text Previous version
   Lenght_2 = xmlhttpResponse.SelectNodes("//Characteristic[starts-with(Name,'ZCOMP_A_')]/ComplexValueList/ValueItem/Value").Item(0).text

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Проверьте это. Если это то, что вы хотели попробовать:

Sub DemoXML()
    Dim XDoc As New DOMDocument, elem As Object, strXML As String

    strXML = "<CharacteristicList><Characteristic><Name>ZCOMP_A_03</Name><ValueList><ValueItem><Value>10.50</Value></ValueItem></ValueList></Characteristic></CharacteristicList>"
    XDoc.LoadXML (strXML)

    For Each elem In XDoc.SelectNodes("//Characteristic")
        [A1] = elem.SelectNodes(".//Name")(0).Text
        [B1] = elem.SelectNodes(".//Value")(0).Text
    Next elem
End Sub

Ссылка для добавления:

Microsoft XML V6.0

Результат:

ZCOMP_A_03
10.5
0 голосов
/ 03 мая 2018

Я бы хотел сделать что-то вроде этого [Name='ZCOMP_A_'], но кажется, что он не существует или не работает так. Я видел несколько кодов с начинается с и содержит, но я хотел бы использовать xpath, аналогичный уже использованный (если возможно).

Characteristic[Name='ZCOMP_A_'] выбирает для Characteristic элементов с дочерним элементом Name, строковое значение которого равно ZCOMP_A_.

Если вы хотите, чтобы она начиналась с этой строки, используйте

Characteristic[starts-with(Name,'ZCOMP_A_')]

Если вы хотите, чтобы оно появилось где-либо внутри этой строки, используйте

Characteristic[contains(Name,'ZCOMP_A_')]

Нет, нет сокращенной формы, которая бы выполняла какие-либо функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...