Skip to content

Use Case: Getting a Single Element

do- edited this page Dec 27, 2021 · 15 revisions

Input

Consider the following XML given as a string named xmlSource:

<?xml version="1.0"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <SendRequestRequest xmlns="urn://some-schema" xmlns:ns0="urn://another-schema">
      <SenderProvidedRequestData Id="Ue7e71ce1-7ce3-4ca5-a689-1a8f2edbb1af">
        <MessageID>3931cda8-3245-11ec-b0bc-000c293433a0</MessageID>
        <ns0:MessagePrimaryContent>
          <ExportDebtRequestsRequest>
            <!-- ... and so on ... -->

Problem

Find the first SenderProvidedRequestData element and get it as a js Object of the following structure:

{SenderProvidedRequestData: {
  Id: "Ue7e71ce1-7ce3-4ca5-a689-1a8f2edbb1af",
  MessageID: "3931cda8-3245-11ec-b0bc-000c293433a0",
  MessagePrimaryContent: {
    ExportDebtRequestsRequest: {
      // and so on
    }
  }
}}

Basic Solution

const {XMLReader, XMLNode} = require ('xml-toolkit')

const data = await new XMLReader ({
  filterElements : 'SenderProvidedRequestData', 
  map            : XMLNode.toObject ({})
}).process (xmlSource).findFirst ()

Explanation

Here:

  • an XMLReader is created;
    • with the filterElements that tells him to ignore anything before the first SenderProvidedRequestData element occurs
    • and the map option requiring the XMLNode.toObject transformation;
  • the process method implicitly creates an XMLLexer instance, performs all the necessary piping;
  • the findFirst asynchronous method waits for the first result, then frees all the resources used and returns the result.

Clone this wiki locally