子元素没有命名空间时的.net System.XML SelectSingleNode

时间:2018-10-24 12:22:58

标签: .net xml system.xml

因此,尝试从此XML中选择节点“ NumSerieFacturaEmisor”:

<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返回null 。我看到的是父元素具有“ ns4”命名空间,但是子元素没有命名空间。我必须更改代码才能选择“ NumSerieFacturaEmisor”子元素吗?

1 个答案:

答案 0 :(得分:0)

找到了解决方案,只需要为我的子元素添加自定义名称空间即可。

所以最终的代码是:

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