Страницы: 1
RSS
vba фильтр при использовании SelectNodes
 
Здравствуйте. Из xml файла нужно получить несколько элементов с определенным значением в поле Title (все элементы, у которых это поле не равно слову Объект), для этого используется такая строка:
Код
Set Nodes = GMPC.SelectNodes("//MyObject[Title!='Объект']")

Как нужно дополнить строку, чтобы исключить все элементы, в поле title которых может содержаться слово Объект  (т.е. вариант написания вроде "Объект 1", "Второй объект" и т.п.)

 
Доброе время суток.
Воспользуйтесь функцией contains
 
Такую функцию пробовал, выдает неизвестный метод
Код
Set Nodes = GMPC.SelectNodes("//MyObject[contains (Title, 'Объект')]")

Скорее всего что-то не так в строке, но не ясно что

 
Цитата
mk12 написал:
выдает неизвестный метод
Для этого надо знать, что и с чем вы работаете - я, увы, не экстрасенс, а вы не читатель правил :(
У меня такой код возвращает два найденных узла
Код
Public Sub test()
    Dim pDoc As New MSXML2.DOMDocument60
    Dim pItems As MSXML2.IXMLDOMSelection
    pDoc.Load "C:\Path\00.xml"
    Set pItems = pDoc.SelectNodes("//item[contains(a/@href, 'bu')]")
    MsgBox pItems.Length
End Sub

Собственно содержимое XML
Скрытый текст
 
Весь код не могу сюда выложить, как и xml, но такого примера должно быть достаточно:
Код
Private Sub test()
Dim GMPC As New MSXML2.DOMDocument
Dim Nodes As MSXML2.IXMLDomNodeList
    GMPC.Load "C:\new 4.xml"
    Set Nodes = GMPC.SelectNodes("//MyObject[Title!='Объект']")
    MsgBox Nodes.Length
End Sub

И вот здесь contains не отрабатывает

XML:

Скрытый текст
Изменено: mk12 - 08.02.2019 13:53:27
 
Цитата
mk12 написал:
Dim ... As New MSXML2.DOMDocument
Вы не видите разницы?
Цитата
Андрей VG написал:
Dim ... As New MSXML2.DOMDocument60
У меня по вашему XML так прекрасно код отработал
Код
Public Sub test()
    Dim pDoc As New MSXML2.DOMDocument60
    Dim pItems As MSXML2.IXMLDOMSelection, pItem As IXMLDOMElement
    pDoc.Load "C:\path\pl.xml"
    Set pItems = pDoc.SelectNodes("//MyObject[not(contains(Title, 'объект') or contains(Title, 'Объект'))]")
    For Each pItem In pItems
        Debug.Print pItem.XML
    Next
End Sub

Получено два узла.
 
Здравствуйте, Андрей! Для любителей позднего связывания:
Код
    Dim pDoc As Object, pItems As Object, pItem As Object
    Set pDoc = CreateObject("Msxml2.DOMDocument.6.0")
Владимир
 
Добрый день, Владимир.
Да, можно и так, тут не поспоришь. Спасибо.
 
С изменением на 6.0 столкнулся с проблемой, что в моем коде SelectNodes вообще перестал работать. Вот исходная часть
Код
Private Sub GetMeasurePointConsumption(id As String, startdate As String, enddate As String, Row As Integer)
Dim sEnv As String
Dim GMPC As New MSXML2.DOMDocument
Set GMPC = CreateObject("MSXML2.DOMDocument")
Set ObjHTTP = New MSXML2.XMLHTTP
Dim NodesSystemsId As MSXML2.IXMLDOMNodeList
Dim Q As MSXML2.IXMLDOMNode
Dim Q_summ As Double
Dim HeatId As New Collection
Dim AllDays As New Collection
Dim AllQ As New Collection
Dim QbyDay As New Collection
Dim DaysNodeElements As MSXML2.IXMLDOMNodeList
Dim QdeltaNodeElements As MSXML2.IXMLDOMNodeList
sURL = "http://192.168.68.119/api.asmx"
sEnv = "<?xml version=""1.0"" encoding=""utf-8""?>"
sEnv = sEnv & "<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""; xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">"
sEnv = sEnv & "<soap:Body>"
sEnv = sEnv & "<nodeId xmlns=""http://www.lers.ru/website/api""> & id & "</nodeId>"
sEnv = sEnv & "<flags xmlns=""http://www.lers.ru/website/api"">Systems</flags"
sEnv = sEnv & "</soap:Body>"
sEnv = sEnv & "</soap:Envelope>"
ObjHTTP.Open "Post", sURL, False
ObjHTTP.setRequestHeader "Content-Type", "text/xml"
ObjHTTP.setRequestHeader "soapAction", "http://www.lers.ru/website/api/GetNodeByIdExtended"
ObjHTTP.send (sEnv)
GMPC.LoadXML ObjHTTP.responseText
MsgBox (GMPC.XML)
Set NodesSystemsId = GMPC.SelectNodes("//MeasurePoint")
MsgBox (NodesSystemsId.Length)
For i = 1 To NodesSystemsId.Length
    HeatId.Add (NodesSystemsId.Item(i - 1).FirstChild.Text)
Next
MsgBox (HeatId.Count)
End Sub

3 и 4 строки меняю на
Код
Dim GMPC As New MSXML2.DOMDocument60
Set GMPC = CreateObject("MSXML2.DOMDocument.6.0")
XML получаю через API
Изменено: mk12 - 08.02.2019 17:01:21
 
Цитата
mk12 написал:
sEnv = sEnv & "<nodeId xmlns=""http://www.lers.ru/website/api""> & id & "</nodeId>"
Эта строка у вас срабатывает ? А где кавычка (") после ' ""> ' ?
Изменено: ocet p - 08.02.2019 19:22:08
 
Цитата
ocet p написал:
Эта строка у вас срабатывает ? А где кавычка (") после ' ""> ' ?
Потерялась при копировании кода на форум, при вставке часть строки заменяется на &quot;&quot;&gt;&quot;
Код
sEnv = sEnv & "<nodeId xmlns=""http://www.lers.ru/website/api"">" & id & "</nodeId>"
Страницы: 1
Наверх