Home > Back-end >  An XML parser that will allow handling individual tag parsing in a flattened way
An XML parser that will allow handling individual tag parsing in a flattened way

Time:10-14

I am looking for an XML parser that will allow handling individual tag parsing in a flattened way. Something that this module does but server/node.js compatible. For example:

const xmlToReact = new someXmlParser({
  Example: (attrs) => {console.log("get all necessary info")},
  Item: (attrs) => {console.log("get all necessary info")}
});

const reactTree = someXmlParser.convert(`
  <Example name="simple">
    <Item i="1">one</Item>
    <Item>two</Item>
    <Item>three</Item>
  </Example>
`);

UPDATE:

Thank you Tuan Anh Tran! the camaro module does pretty much all I am looking for. May I ask you further questions?

My XML looks like following:

  <para style="p">
        <verse number="1" style="v" />В начале Всевышний
        <note caller=" " style="f">
            <char style="fr" closed="false">1:1 </char>
            <char style="fk" closed="false">Всевышний </char>
            <char style="ft" closed="false">– на языке оригинала: «Элохим» – слово, родственное арабскому «Аллах». См. приложение V.</char>
        </note> сотворил небо и землю. 
        <verse number="2" style="v" />Земля была безлика и пуста, тьма была над бездной, и Дух Всевышнего парил над водами.
    </para>
    <para style="p">
        <verse number="3" style="v" />И сказал Всевышний: «Да будет свет», и появился свет. 
        <verse number="4" style="v" />Всевышний увидел, что свет хорош, и отделил его от тьмы. 
        <verse number="5" style="v" />Он назвал свет «днём», а тьму – «ночью». И был вечер, и было утро – день первый.
    </para>
    <para style="p">
        <verse number="6" style="v" />И сказал Всевышний: «Да будет свод между водами, чтобы отделить воду от воды». 
        <verse number="7" style="v" />Всевышний создал свод и отделил воду под сводом от воды над ним; и стало так. 
        <verse number="8" style="v" />И Он назвал свод «небом». И был вечер, и было утро – день второй.
    </para>

notice the verse tag. It is a self-closed tag. The result I am looking should look as follow:

{
      "verses": [
        {
          "number": "1",
          "text": "text that runs till the next occurrence of the verse tag"
        },
        {
          "number": "2",
          "text": "text that runs till the next occurrence of the verse tag"
        },
        {
          "number": "3",
          "text": "text that runs till the next occurrence of the verse tag"
        }
    ]
}

How can I accomplish it with camara parser?

CodePudding user response:

i think camaro would fit your needs. you reshape the xml via the xpath template.

eg

const { transform } = require('camaro')

const xml = `
<Example name="simple">
    <Item i="1">one</Item>
    <Item>two</Item>
    <Item>three</Item>
  </Example>
`
const template = {
    examples: ['/Example', {
        name: '@name',
        items: ['Item', '.']
    }]
}

async function main() {
    const output = await transform(xml, template)
    console.log(JSON.stringify(output, null, 2))
}

main()

{
  "examples": [
    {
      "name": "simple",
      "items": [
        "one",
        "two",
        "three"
      ]
    }
  ]
}
  • Related