Takes an XML file and transforms it into a CSV file, based on a mapping you provide.
One XML element and its contents can be transformed into multiple CSV output lines.
$ npm install xml-flatten2csv --save
const xmlFlatten2csv = require('xml-flatten2csv')
xmlFlatten2csv(
{
xmlPath: 'path/to/file.xml',
csvPath: 'path/to/file.csv',
rootXMLElement: 'Episode',
pivotPath: '$.People.Person',
headerMap: [
['$.Title', 'title', 'string'],
['@.Name', 'name', 'string'],
[{ test: '@.Age<=16', value: 'yes'}, 'child', 'string'],
[{ test: '@.Age>16', select: '@.Age'}, 'age', 'integer']
]
}
)
.then(() => console.log("Done!"))
.catch(err => console.error(err))
Input:
<Simpsons>
<Episode>
<Title>Cape Feare</Title>
<People>
<Person>
<Name>Bart</Name>
<Age>10</Age>
</Person>
<Person>
<Name>Marge</Name>
<Age>36</Age>
</Person>
<Person>
<Name>Lisa</Name>
<Age>8</Age>
</Person>
<Person>
<Name>Sideshow Bob</Name>
</Person>
</People>
</Episode>
<Episode>
<Title>Homer Loves Flanders</Title>
<People>
<Person>
<Name>Homer</Name>
<Age>39</Age>
</Person>
<Person>
<Name>Ned Flanders</Name>
<Age>60</Age>
</Person>
</People>
</Episode>
</Simpsons>
Output:
"title","name","child","age"
"Cape Feare","Bart","yes",
"Cape Feare","Marge",,36
"Cape Feare","Lisa","yes",
"Cape Feare","Sideshow Bob",,
"Homer Loves Flanders","Homer",,39
"Homer Loves Flanders","Ned Flanders",,60
Property | Type | Notes |
---|---|---|
xmlPath |
string |
A path to the xml input file. |
csvPath |
string |
The path and filename of the generated CSV output file (note that any intermediate folders will be created). |
rootXMLElement |
string |
The XML root tag for each subtree to process, |
pivotPath |
string |
The jsonpath of the elements to split records on |
headerMap |
[array] |
See the Header Map section for more details. |
options |
object |
See Additional options |
options.headerMap has the structure:
[
[selector, csvHeader, type],
[selector, csvHeader, type],
...
]
- selector is either a jsonpath into the subtree, or a condition consisting of a jsonpath test and either a value or a jsonpath into the subtree
- type must be integer, date or string
For straightforward linear transformations, where one XML subtree maps to one line of CSV output, consider xml2csv instead.
The additional options are a set of key-value pairs -
Option | Notes |
---|---|
namespace |
How to handle namespace prefixes - omit to do nothing, 'strip' to remove prefixes, or any other string to replace the ':' with something else |
xmllang |
If set to 'wrap', when an element has an xml:lang attribute, create an intermediate wrapper element of named for the attribute value. Eg <description xml:lang='en'>Sunny</description> would effectively become <description><en>Sunny</en></description> , and can be addressed as $.description.en in the header map. |
transform |
A transformation function applied to the selected JSON objects before running the header map queries. The modified JSON should be the return value of the function, even if it's changed in-place. |
$ npm test