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"
]
}
]
}