Таким образом, пытаясь выбрать узел "NumSerieFacturaEmisor" из этого XML:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns4:RespuestaLRFacturasEmitidas xmlns:ns4="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/igic/ws/RespuestaSuministro.xsd" xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/igic/ws/SuministroInformacion.xsd"> <ns4:RespuestaLinea> <ns4:IDFactura> <IDEmisorFactura> <NIF>B44444395</NIF> </IDEmisorFactura> <NumSerieFacturaEmisor>FV1810007</NumSerieFacturaEmisor> <FechaExpedicionFacturaEmisor>24-10-2018</FechaExpedicionFacturaEmisor> </ns4:IDFactura> </ns4:RespuestaLinea> </ns4:RespuestaLRFacturasEmitidas> </soap:Body> </soap:Envelope>
Используя функции DotNet System.Xml:
XMLNamespaceMgr.AddNamespace('ns4','https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/igic/ws/RespuestaSuministro.xsd'); FoundXMLNodeList = XMLRootNode.SelectNodes('//ns4:RespuestaLinea',XMLNamespaceMgr); FOR Index := 0 TO FoundXMLNodeList.Count - 1 DO BEGIN XMLNode := FoundXMLNodeList.Item(Index); FoundXMLNode := XMLRootNode.SelectSingleNode('//ns4:IDFactura//NumSerieFacturaEmisor',XMLNamespaceMgr); DocNo := FoundXMLNode.InnerText; END
Так что XMLRootNode.SelectSingleNode возвращает ноль .Я вижу, что родительский элемент имеет пространство имен "ns4", но дочерний элемент не имеет пространства имен.Нужно ли менять свой код, чтобы выбрать дочерний элемент «NumSerieFacturaEmisor»?
Нашел решение, просто нужно добавить пользовательское пространство имен для моих дочерних элементов.
Итак, окончательный код:
XMLNamespaceMgr.AddNamespace('ns4','https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/igic/ws/RespuestaSuministro.xsd'); XMLNamespaceMgr.AddNamespace('custom','https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/igic/ws/SuministroInformacion.xsd'); FoundXMLNodeList = XMLRootNode.SelectNodes('//ns4:RespuestaLinea',XMLNamespaceMgr); FOR Index := 0 TO FoundXMLNodeList.Count - 1 DO BEGIN XMLNode := FoundXMLNodeList.Item(Index); FoundXMLNode := XMLRootNode.SelectSingleNode('//ns4:IDFactura//custom:NumSerieFacturaEmisor',XMLNamespaceMgr); DocNo := FoundXMLNode.InnerText; END