xml到json,有没有一种方法可以使用属性的值作为键来简化查找?

时间:2019-07-17 16:58:12

标签: node.js xml-parsing

我有一个包含多个项目的XML文件,我尝试了几个xml到json libray并放置在csv-parser上。 现在,如果我想在转换对象之前检查对象是否满足我的要求,我需要遍历所有项,然后遍历属性标记以查看是否可以找到属性DisplayType,然后检查其值。 / p>

是否可以告诉csv-parser使用“名称”属性作为对象的ID?

有时候我彼此之间有5个for循环,这令人困惑。

编辑: 主要目标是过滤属性[@ name ='DisplayType'] 的值为武器的项目,循环遍历并做一些事情。然后冲洗并重复其他属性和属性。

在插入数据库之前,我需要过滤,整理和添加数据。

“原始”:

<items>
    <item name="Knife">
        <property name="HoldType" value="31"/>
        <property name="DisplayType" value="Weapon"/>
        <property name="Meshfile" value="Items/Misc/parcelPrefab"/>
        <property name="Material" value="MresourceCrop"/>
        <property name="Stack" value="10"/> 
        <property name="Value" value="3"/>
        <events>
                <event name="Testing Events" type="Something"/>
                <event name="Testing Events2" type="Something"/>
        </events>
    </item>
    <item name="Knife">
        <property name="HoldType" value="31"/>
        <property name="DisplayType" value="Weapon"/>
        <property name="Meshfile" value="Items/Misc/parcelPrefab"/>
        <property name="Material" value="MresourceCrop"/>
        <property name="Stack" value="10"/> 
        <property name="Value" value="3"/>
    </item>
</items>

Json(示例):

{
    "items": {
        "item": [
            {
                "name": "Knife",
                "property": [
                    {
                        "name": "HoldType",
                        "value": "31"
                    },
                    {
                        "name": "DisplayType",
                        "value": "Weapon"
                    },
                    {
                        "name": "Meshfile",
                        "value": "Items/Misc/parcelPrefab"
                    },
                    {
                        "name": "Material",
                        "value": "MresourceCrop"
                    },

我希望得到的东西:

{
    "items": {
            "Knife": {
                "name": "Knife",
                "property": [
                    "HoldType": {
                        "name": "HoldType",
                        "value": "31"
                    },
                    "DisplayType": {
                        "name": "DisplayType",
                        "value": "Weapon"
                    },
                    "Meshfile": {
                        "name": "Meshfile",
                        "value": "Items/Misc/parcelPrefab"
                    },
                    "Material": {
                        "name": "Material",
                        "value": "MresourceCrop"
                    },

2 个答案:

答案 0 :(得分:1)

xpath表达式

/items/item/property[@name="DisplayType"][@value="Weapon"]

或等价物

/items/item/property[@name="DisplayType" and @value="Weapon"]

将在示例中选择两个具有所需属性值的节点。

答案 1 :(得分:1)

你能试试吗

const { transform } = require('camaro')

;(async function () {
    const xml = `
    <items>
        <item name="Knife">
            <property name="HoldType" value="31"/>
            <property name="DisplayType" value="Weapon"/>
            <property name="Meshfile" value="Items/Misc/parcelPrefab"/>
            <property name="Material" value="MresourceCrop"/>
            <property name="Stack" value="10"/> 
            <property name="Value" value="3"/>
            <events>
                    <event name="Testing Events" type="Something"/>
                    <event name="Testing Events2" type="Something"/>
            </events>
        </item>
        <item name="Knife">
            <property name="HoldType" value="31"/>
            <property name="DisplayType" value="Weapon"/>
            <property name="Meshfile" value="Items/Misc/parcelPrefab"/>
            <property name="Material" value="MresourceCrop"/>
            <property name="Stack" value="10"/> 
            <property name="Value" value="3"/>
        </item>
    </items>
    `

    const template = {
        items: {
            Knife: ['/items/item[@name="Knife"]', {
                Name: '@name',
                HoldType: 'property[@name="HoldType"]/@value',
                DisplayType: 'property[@name="DisplayType"]/@value',
                Meshfile: 'property[@name="Meshfile"]/@value',
                Material: 'property[@name="Material"]/@value',
                Stack: 'property[@name="Stack"]/@value',
                Value: 'property[@name="Value"]/@value',
            }]
        }
    }

    const result = await transform(xml, template)

    console.log(JSON.stringify(result, null, 2))
})()

输出

enter image description here