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 to IDVersionSii using getFirstChildElement.
    Copy
    console.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>