node.js - xml 到 json,有没有办法使用属性的值作为键以便于查找?

标签 node.js xml-parsing

我有一个包含多个项目的 XML 文件,我尝试了几个 xml 到 json 库并选择了 csv-parser。 现在,如果我想在转换对象之前检查对象是否满足我想要的要求,我需要循环遍历项目,然后循环遍历属性标签以查看是否可以找到属性 DisplayType 并检查它的值。

有没有办法告诉 csv-parser 使用“name”属性作为对象的 ID?

有时我会互相插入 5 个 for 循环,这会让人感到困惑。

编辑: 主要目标是过滤 property[@name='DisplayType'] 值为 Weapon 的项目,循环遍历这些项目并执行一些操作。然后对其他特性和属性重复并重复。

在插入数据库之前,我需要过滤、排列和添加数据。

“原始”:

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

最佳答案

你能试试这个吗

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

关于node.js - xml 到 json,有没有办法使用属性的值作为键以便于查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57080888/

相关文章:

java - 如何使用 Java 从 XML 中读取值并将其保存在 Hashmap 中

node.js - Socket.io 通过 id 获取套接字不起作用

java - 将 HTML 转换为 XML 并解析它 - Android 应用

node.js - 如何将 docker 环境变量传递给 npm 脚本?

javascript - 获取GDrive中文件和文件夹之间的联系

xml - 如何轻松提取精心指定的 XML 数据?

java - 合并多个xml文件,并将每个xml文件的公共(public)根元素设置为合并文件的根

java - 读取两个同名 Java 的 XML 标签

node.js - 如何在 Jest 中监视导出和模拟的函数

node.js - 将跨平台工作的 CLI 应用程序日志文件保存在哪里?