使用XML模式将XML转换为JSON

使用XML模式将XML转换为JSON,xml,json,Xml,Json,我想将XML转换为JSON(具体地说,是一种响应)。我目前使用的是node.js,但问题是JSON非常冗长,甚至在子元素只有一个且永远不会超过一个的情况下,也会有很多嵌套和数组级别。问题是xml2js对XML文件的模式一无所知,因此必须保守 我的问题是,是否有其他(最好是JavaScript)代码可以使用XML模式来指导转换过程?所以,若模式定义了XML的类型和结构,那个么JSON就会利用这一点,自动拥有正确的类型,而不是不必要的数组级别。XML模式用于XML验证。无法使用XML模式转换任何内容

我想将XML转换为JSON(具体地说,是一种响应)。我目前使用的是node.js,但问题是JSON非常冗长,甚至在子元素只有一个且永远不会超过一个的情况下,也会有很多嵌套和数组级别。问题是
xml2js
对XML文件的模式一无所知,因此必须保守


我的问题是,是否有其他(最好是JavaScript)代码可以使用XML模式来指导转换过程?所以,若模式定义了XML的类型和结构,那个么JSON就会利用这一点,自动拥有正确的类型,而不是不必要的数组级别。

XML模式用于XML验证。无法使用XML模式转换任何内容。模式定义XML文档的结构。如果要转换某些内容,需要XSLT,它是一种XML转换规范。请看这里如何在JavaScript中实现这一点:

我对X2JS有一个类似但相反的问题:如果只有一个子元素,它将不会创建列表(即使它应该是列表)。解决方案(对我来说)是向转换器提供额外的选项“arrayformpath”——这会导致匹配元素成为一个数组,即使只有一个元素


我同意应该有一种方法使用XML模式来实现这一点……但我也找不到任何东西。

最后,我决定实现这样一个包:

因此,对于取自以下内容的XML:

但该软件包提供了以下信息:

{
  "purchaseOrder": {
    "$": {
      "orderDate": "1999-10-20T00:00:00.000Z"
    },
    "shipTo": {
      "$": {
        "country": "US"
      },
      "name": "Alice Smith",
      "street": "123 Maple Street",
      "city": "Mill Valley",
      "state": "CA",
      "zip": 90952
    },
    "billTo": {
      "$": {
        "country": "US"
      },
      "name": "Robert Smith",
      "street": "8 Oak Avenue",
      "city": "Old Town",
      "state": "PA",
      "zip": 95819
    },
    "comment": "Hurry, my lawn is going wild!",
    "items": {
      "item": [
        {
          "$": {
            "partNum": "872-AA"
          },
          "productName": "Lawnmower",
          "quantity": 1,
          "USPrice": 148.95,
          "comment": "Confirm this is electric"
        },
        {
          "$": {
            "partNum": "926-AA"
          },
          "productName": "Baby Monitor",
          "quantity": 1,
          "USPrice": 39.98,
          "shipDate": "1999-05-21T00:00:00.000Z"
        }
      ]
    }
  }
}

在GitHub上找到执行作业的以下项目库:


这个库用java完成这项工作。它还没有完全成熟,但使用提供的模式进行转换

如果您正在寻找java解决方案

  • 可以在这里找到使用标准jdk工具
    xjc
    的解决方案:。使用
    xjc
    可以从XML模式创建Java类,并使用JAXB工具以不同的格式读入和写出数据
  • 如果您想直接从XML文件转换,您可以使用下面描述的库:

我想将XML文档的结构转换为JSON。当然,这会有所帮助。例如,
maxOccurs
可以帮助您知道是否应该创建数组(如果
maxOccurs
为1,则不需要数组)。和
type
可以帮助您转换为JSON类型。@Mitar您可以将XML模式转换为JSON,但这也需要XSLT。模式不会转换任何东西。我是说模式可以用来帮助转换过程。@Mitar是的,文本编辑器也可以帮助转换过程。“这个包构建在node-xml2js之上,检测并解析XML模式,然后用于将JavaScript对象转换为一致的模式驱动结构。”@Mitar,这看起来很有希望。有更新的计划吗?我刚刚试着安装:“发现13个漏洞(1个低,10个中等,2个高)”所附的示例没有按预期工作。任何帮助,都会大有裨益
{
  "purchaseOrder": {
    "$": {
      "orderDate": "1999-10-20",
      "xmlns": "http://www.example.com/PO"
    },
    "shipTo": [
      {
        "$": {
          "country": "US"
        },
        "name": [
          "Alice Smith"
        ],
        "street": [
          "123 Maple Street"
        ],
        "city": [
          "Mill Valley"
        ],
        "state": [
          "CA"
        ],
        "zip": [
          "90952"
        ]
      }
    ],
    "billTo": [
      {
        "$": {
          "country": "US"
        },
        "name": [
          "Robert Smith"
        ],
        "street": [
          "8 Oak Avenue"
        ],
        "city": [
          "Old Town"
        ],
        "state": [
          "PA"
        ],
        "zip": [
          "95819"
        ]
      }
    ],
    "comment": [
      "Hurry, my lawn is going wild!"
    ],
    "items": [
      {
        "item": [
          {
            "$": {
              "partNum": "872-AA"
            },
            "productName": [
              "Lawnmower"
            ],
            "quantity": [
              "1"
            ],
            "USPrice": [
              "148.95"
            ],
            "comment": [
              "Confirm this is electric"
            ]
          },
          {
            "$": {
              "partNum": "926-AA"
            },
            "productName": [
              "Baby Monitor"
            ],
            "quantity": [
              "1"
            ],
            "USPrice": [
              "39.98"
            ],
            "shipDate": [
              "1999-05-21"
            ]
          }
        ]
      }
    ]
  }
}
{
  "purchaseOrder": {
    "$": {
      "orderDate": "1999-10-20T00:00:00.000Z"
    },
    "shipTo": {
      "$": {
        "country": "US"
      },
      "name": "Alice Smith",
      "street": "123 Maple Street",
      "city": "Mill Valley",
      "state": "CA",
      "zip": 90952
    },
    "billTo": {
      "$": {
        "country": "US"
      },
      "name": "Robert Smith",
      "street": "8 Oak Avenue",
      "city": "Old Town",
      "state": "PA",
      "zip": 95819
    },
    "comment": "Hurry, my lawn is going wild!",
    "items": {
      "item": [
        {
          "$": {
            "partNum": "872-AA"
          },
          "productName": "Lawnmower",
          "quantity": 1,
          "USPrice": 148.95,
          "comment": "Confirm this is electric"
        },
        {
          "$": {
            "partNum": "926-AA"
          },
          "productName": "Baby Monitor",
          "quantity": 1,
          "USPrice": 39.98,
          "shipDate": "1999-05-21T00:00:00.000Z"
        }
      ]
    }
  }
}