Здравствуйте. Следующий код должен выдавать количество подходящих узлов MeasurePoint, в которых поле Title содержит "Газ"
Код
Private Sub test()
Dim doc As MSXML2.DOMDocument
Dim nlist As MSXML2.IXMLDOMNodeList
Set doc = New MSXML2.DOMDocument
doc.setProperty "SelectionLanguage", "XPath"
doc.Load "d:\5.xml"
MsgBox doc.XML
Set nlist = doc.SelectNodes("//MeasurePoint[contains(Title,'Газ')]")
MsgBox "Matching Nodes : " & nlist.Length
End Sub
xml файл получаю по API, имеет вид:
Скрытый текст
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/";; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";; xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetNodeByIdExtendedResult xmlns="http://www.lers.ru/website/api"><ErrorMessage/>;<ErrorCode>None</ErrorCode><Node><Id>1380</Id><Title>Котельная, г. Ломоносов</Title><Address>г. Ломоносов</Address> <Number>545</Number><Comment/><ResponsibleName/><ResponsiblePhone/><Type>Node</Type><Systems><AllMeasurePoints><MeasurePoint><Id>1711</Id><Title>СО - подпитка</Title><FullTitle>Котельная, г. ЛомоносовСО - подпитка</FullTitle><Address>г. Ломоносов</Address><SystemType>ColdWater</SystemType><Type>Regular</Type><Number>287</Number><Comment/><State>Error</State><NodeId>1380</NodeId><IsDoublePipeHotWaterSystem>false</IsDoublePipeHotWaterSystem><IsTwoChannels>false</IsTwoChannels><CurrentRatio>1</CurrentRatio><VoltageRatio>1</VoltageRatio><DataParameters><DataParameter>T_in</DataParameter><DataParameter>P_in</DataParameter><DataParameter>M_in</DataParameter><DataParameter>V_in</DataParameter><DataParameter>NormalOperationDuration</DataParameter></DataParameters></MeasurePoint><MeasurePoint><Id>1712</Id><Title>ГВС</Title><FullTitle>Котельная, г. Ломоносов - ГВС</FullTitle><Address>г. Ломоносов</Address><SystemType>HotWater</SystemType><Type>Regular</Type><Number>288</Number><Comment/><State>Error</State><NodeId>1380</NodeId><IsDoublePipeHotWaterSystem>true</IsDoublePipeHotWaterSystem><IsTwoChannels>true</IsTwoChannels><CurrentRatio>1</CurrentRatio><VoltageRatio>1</VoltageRatio><DataParameters><DataParameter>T_in</DataParameter><DataParameter>T_out</DataParameter><DataParameter>T_delta</DataParameter><DataParameter>T_cw</DataParameter><DataParameter>P_in</DataParameter><DataParameter>P_out</DataParameter><DataParameter>M_in</DataParameter><DataParameter>M_out</DataParameter><DataParameter>M_delta</DataParameter><DataParameter>V_in</DataParameter><DataParameter>V_out</DataParameter><DataParameter>V_delta</DataParameter><DataParameter>Q_in</DataParameter><DataParameter>Q_out</DataParameter><DataParameter>Q_delta</DataParameter><DataParameter>NormalOperationDuration</DataParameter></DataParameters></MeasurePoint><MeasurePoint><Id>1710</Id><Title>СО</Title><FullTitle>Котельная, г. Ломоносов - СО</FullTitle><Address>г. Ломоносов</Address><SystemType>Heat</SystemType><Type>Regular</Type><Number>286</Number><Comment/><State>Error</State><NodeId>1380</NodeId><IsDoublePipeHotWaterSystem>false</IsDoublePipeHotWaterSystem><IsTwoChannels>true</IsTwoChannels><CurrentRatio>1</CurrentRatio><VoltageRatio>1</VoltageRatio><DataParameters><DataParameter>T_in</DataParameter><DataParameter>T_out</DataParameter><DataParameter>T_delta</DataParameter><DataParameter>T_cw</DataParameter><DataParameter>P_in</DataParameter><DataParameter>P_out</DataParameter><DataParameter>M_in</DataParameter><DataParameter>M_out</DataParameter><DataParameter>M_delta</DataParameter><DataParameter>V_in</DataParameter><DataParameter>V_out</DataParameter><DataParameter>Q_in</DataParameter><DataParameter>Q_out</DataParameter><DataParameter>Q_delta</DataParameter><DataParameter>NormalOperationDuration</DataParameter></DataParameters></MeasurePoint><MeasurePoint><Id>1292</Id><Title>Газ</Title><FullTitle>Котельная, г. Ломоносов - Газ</FullTitle><Address>г. Ломоносов</Address><SystemType>Gas</SystemType><Type>Regular</Type><Number>437</Number><Comment/><State>Normal</State><NodeId>1380</NodeId><IsDoublePipeHotWaterSystem>false</IsDoublePipeHotWaterSystem><IsTwoChannels>false</IsTwoChannels><CurrentRatio>1</CurrentRatio><VoltageRatio>1</VoltageRatio><DataParameters><DataParameter>T_outdoor</DataParameter><DataParameter>T</DataParameter><DataParameter>P</DataParameter><DataParameter>V</DataParameter><DataParameter>V_std</DataParameter></DataParameters></MeasurePoint></AllMeasurePoints></Systems><GeoLocation><Latitude>59.9</Latitude><Longitude>29.7</Longitude></GeoLocation><State>Error</State><Territory><Id>825</Id><Name>545 Котельная, г. Ломоносов</Name><TimeZone><Offset>3</Offset><Title>(UTC+03:00) Волгоград, Москва, Санкт-Петербург (RTZ 2)</Title></TimeZone><CopyMeasurePointId xsi:nil="true"/></Territory></Node></GetNodeByIdExtendedResult></soap:Body></soap:Envelope>
При этом если <GetNodeByIdExtendedResult xmlns="http://www.lers.ru/website/api">; заменить на <GetNodeByIdExtendedResult>, то поиск выполняется Что нужно добавить в коде, чтобы поиск выполнялся без модификации xml файла?
С изменением на 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, но такого примера должно быть достаточно:
Код
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
Здравствуйте. Из xml файла нужно получить несколько элементов с определенным значением в поле Title (все элементы, у которых это поле не равно слову Объект), для этого используется такая строка:
Код
Set Nodes = GMPC.SelectNodes("//MyObject[Title!='Объект']")
Как нужно дополнить строку, чтобы исключить все элементы, в поле title которых может содержаться слово Объект (т.е. вариант написания вроде "Объект 1", "Второй объект" и т.п.)
И ещё вопрос по PowerShell. Можно ли скрипт, написанный на нем запустить из Excel? В Excel будет несколько кнопок, по нажатию на которые должны выполнятся разные функции.
JeyCi написал: а через DDE поддерживает передачу данных
Про dde в описании программы ничего не нашел, скорее всего нет поддержки
Цитата
Игорь написал: на том, в чем вы лучше разбираетесь
Powershell вообще новая вещь для меня, но когда узнал про её возможности стало интересно изучить. На VBA уже делал несколько проектов, но и в нем знания далеки от идеала.
Цитата
Игорь написал: powershell поддерживает работу с cookies (поскольку работает с .Net) - но тут менее удобно будет взаимодействие с объектной моделью Excel
Объектная модель Excel не пугает, сложность в том, что никогда раньше не работал с какими-либо API и пока трудно представить, как реализовать требуемые запросы в VBA
Здравствуйте. Опишу задачу в общих чертах, нужна помощь с определением пути решения. В зависимости от рекомендаций, возможно, пойдут более конкретные вопросы. Есть таблица в Excel с большим количеством строк и столбцов. Данные для них нужно получить из сторонней программы. У программы имеется WEB API и Framework. На чем лучше реализовать подгрузку данных из программы в таблицу, vba или powershell? Для того, чтобы получить доступ через api обязательно требуется авторизация с поддержкой cookies на клиентской стороне.