如何使用javascript将xml属性及其值提取为json格式



寻求帮助将xml转换为json。我得到了一个输入

"<logRecord>
<logRecord>
<logRecord>
<class name="dto">
<logField fieldName="ID" oldValue=" " newValue="650"/>
<logField fieldName="submissionDt" oldValue="" newValue="03-12-2022"/>
</class>
</logRecord>
</logRecord>
</logRecord>"

我想改成

[{fieldName : 'ID', oldValue : '' , newValue " '650'}.
{fieldName : 'submissionDt', oldValue : '' , newValue : '03-12-2022'}]

有可能吗?由于

我几乎可以肯定,可能有更好的方法来做到这一点,所以我完全希望有人来批评我的尝试。然而,我实现这一点的方法(使用我所知道的函数)是使用xpath从XML中提取给定的值。

我已经注释了代码,试图准确地解释我在做什么,但本质上,我在循环每个<class>,然后循环每个<logField>,最后循环每个属性。

//First we'll take our (slightly more complex) XML input string
var xmlString = "<logRecord><logRecord><logRecord><class name="dto"><logField fieldName="ID" oldValue="" newValue="650" /><logField fieldName="submissionDt" oldValue="" newValue="03-12-2022" /></class></logRecord><logRecord><class name="dto"><logField fieldName="ID" oldValue="" newValue="123" /><logField fieldName="submissionDt" oldValue="" newValue="19-12-2022" /></class></logRecord></logRecord></logRecord>";
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(xmlString, "text/xml");
//Create a new XPathEvaluator
const evaluator = new XPathEvaluator();
//Evaluate given xpath to target every <class> found inside the XML
const classExpression = evaluator.createExpression('//class');
const classResult = classExpression.evaluate(xmlDoc, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
//Declare a final array
var arr = [];
//Loop each found instance of <class>
for (i=0; i<classResult.snapshotLength; i++) {

//Find all instances of <logField> inside of THIS <class>
const logFieldExpression = evaluator.createExpression('./logField');
const logFieldResult = logFieldExpression.evaluate(classResult.snapshotItem(i), XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);

//Declare an array to hold each of our <logField>s
var logFieldObj = [];

//Loop each <logField> inside of the <class>
for (j=0; j<logFieldResult.snapshotLength; j++) {

//Find all attributes for THIS <logField>
const attrEvaluator = evaluator.createExpression('./@*');
const attrResult = attrEvaluator.evaluate(logFieldResult.snapshotItem(j), XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);

//Declare a final object to hold each of the attributes fieldName, oldValue and newValue
var attrObj = {};

//Loop over each attribute
for (k=0; k<attrResult.snapshotLength; k++) {
//Add attribute as attributeName => attributeValue to our object
attrObj[attrResult.snapshotItem(k).localName] = attrResult.snapshotItem(k).textContent;
}
//Add our object to an array
logFieldObj.push(attrObj);
}

//Create the final resulting array
arr.push(logFieldObj);
}
console.log(arr);

最新更新