1 Handling namespace
Parsing a document with namespaces may lead to the need of use the namespace prefix for seaches. Let's see the following example:
Copy
var dbf = new Ax.xml.DocumentBuilderFactory(); dbf.setNamespaceAware(true); var messageTest = ` <ns4:RespuestaLRFacturasEmitidas xmlns:ns4="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/igic/ws/RespuestaSuministro.xsd"> <ns4:CSV>F5XR9KG4LDVJ8AKF</ns4:CSV> <ns4:Cabecera> <IDVersionSii>1.0</IDVersionSii> </ns4:Cabecera> </ns4:RespuestaLRFacturasEmitidas> `; var messageResponseXML = dbf.parse(messageTest); var mainTag = messageResponseXML.getRootElement().getTagName(); var nodeResponse = messageResponseXML.getNode(mainTag); console.log("========= CSV"); console.log(nodeResponse.getNode("ns4:CSV").getChildCharacterData()); console.log("========= Cabecera"); console.log(nodeResponse.getNode("ns4:Cabecera")); console.log("========= Cabecera/IDVersionSii (XPATH)"); console.log(nodeResponse.getNode("ns4:Cabecera/IDVersionSii")); console.log("------");
========= CSV
F5XR9KG4LDVJ8AKF
========= Cabecera
<ns4:Cabecera xmlns:ns4="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/igic/ws/RespuestaSuministro.xsd">
<IDVersionSii xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/igic/ws/SuministroInformacion.xsd">1.0</IDVersionSii>
</ns4:Cabecera>
========= Cabecera/IDVersionSii
null
2 Namespace issues
In previous example, the acces to "ns4:Cabecera/IDVersionSii"
will not be found, cause IDVersionSii
inherits the default xmlns
attribute and we have not specified it.
The xmlns namespace to has been added because your parent element (Cabecera
) is in a
namespace and your child element (IDVersionSii
) is not.
A solution can be:
-
Avoid XPATH and access the
ns4:Cabecera
element and go toIDVersionSii
using getFirstChildElement.Copyconsole.log("========= Cabecera/IDVersionSii (getFirstChildElement)"); console.log(nodeResponse.getNode("ns4:Cabecera").getFirstChildElement());
<IDVersionSii xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/igic/ws/SuministroInformacion.xsd">1.0</IDVersionSii>
-
Remove namespace attributes from the document.
Copy
var dbf = new Ax.xml.DocumentBuilderFactory(); dbf.setNamespaceAware(true); var messageTest = ` <ns4:RespuestaLRFacturasEmitidas xmlns:ns4="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/igic/ws/RespuestaSuministro.xsd"> <ns4:CSV>F5XR9KG4LDVJ8AKF</ns4:CSV> <ns4:Cabecera> <IDVersionSii>1.0</IDVersionSii> </ns4:Cabecera> </ns4:RespuestaLRFacturasEmitidas> `; var messageResponseXML = dbf.parse(messageTest); var mainTag = messageResponseXML.getRootElement().getTagName(); var nodeResponse = messageResponseXML.getNode(mainTag); // Remove namespaces nodeResponse.removeNamespaces(); console.log("========= CSV"); console.log(nodeResponse.getNode("CSV").getChildCharacterData()); console.log("========= Cabecera"); console.log(nodeResponse.getNode("Cabecera")); console.log("========= Cabecera/IDVersionSii (XPATH)"); console.log(nodeResponse.getNode("Cabecera/IDVersionSii")); console.log("========= Cabecera/IDVersionSii (getFirstChildElement)"); console.log(nodeResponse.getNode("Cabecera").getFirstChildElement());
========= Cabecera <Cabecera> <IDVersionSii>1.0</IDVersionSii> </Cabecera> ========= Cabecera/IDVersionSii (XPATH) <IDVersionSii>1.0</IDVersionSii> ========= Cabecera/IDVersionSii (getFirstChildElement) <IDVersionSii>1.0</IDVersionSii>