我有一个包含多个项目的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"
},
答案 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))
})()
输出