.net System.XML SelectSingleNode, когда дочерние элементы не имеют пространства имен - PullRequest
0 голосов
/ 24 октября 2018

Таким образом, пытаясь выбрать узел "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»?

1 Ответ

0 голосов
/ 24 октября 2018

Нашел решение, просто нужно добавить пользовательское пространство имен для моих дочерних элементов.

Итак, окончательный код:

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
...