使用XML Schema将XML转换为JSON

时间:2014-06-12 00:59:49

标签: xml json

我想将XML转换为JSON(具体来说,是OAI-PMH响应)。我目前正在使用node.js xml2js,但问题是JSON非常冗长,有很多级别的嵌套和数组,即使只有一个元素作为子元素,也永远不会超过一个。问题是xml2js对XML文件的架构一无所知,所以它必须保守。

我的问题是,是否还有其他(最好是JavaScript)代码可以使用XML Schema来指导转换过程?因此,如果schema定义了XML的类型和结构,那么JSON就会利用它并自动拥有正确的类型,而不是不必要的数组级别。

5 个答案:

答案 0 :(得分:1)

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

我同意应该有一种方法可以使用XML Schema来做到这一点......但我也找不到任何东西。

答案 1 :(得分:1)

最后,我决定只实施这样一个包:xml4js

对于从XML Primer获取的XML:

<?xml version="1.0"?>
<purchaseOrder orderDate="1999-10-20" xmlns="http://www.example.com/PO">
   <shipTo country="US">
      <name>Alice Smith</name>
      <street>123 Maple Street</street>
      <city>Mill Valley</city>
      <state>CA</state>
      <zip>90952</zip>
   </shipTo>
   <billTo country="US">
      <name>Robert Smith</name>
      <street>8 Oak Avenue</street>
      <city>Old Town</city>
      <state>PA</state>
      <zip>95819</zip>
   </billTo>
   <comment>Hurry, my lawn is going wild!</comment>
   <items>
      <item partNum="872-AA">
         <productName>Lawnmower</productName>
         <quantity>1</quantity>
         <USPrice>148.95</USPrice>
         <comment>Confirm this is electric</comment>
      </item>
      <item partNum="926-AA">
         <productName>Baby Monitor</productName>
         <quantity>1</quantity>
         <USPrice>39.98</USPrice>
         <shipDate>1999-05-21</shipDate>
      </item>
   </items>
</purchaseOrder>

如果不使用XML Schema来指导转换过程,则在启用显式数组的情况下,您将获得:

{
  "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"
        }
      ]
    }
  }
}

答案 2 :(得分:1)

在GitHub上找到了以下项目库来完成这项工作:Schema Aware XML to JSON translator

这个库在java中完成工作。它仍然没有完全成熟,但使用Schema提供的转换。

答案 3 :(得分:-1)

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

答案 4 :(得分:-3)

XML模式用于XML验证。无法使用XML架构转换任何内容。模式定义XML文档的结构。如果你想转换某些内容,你需要一个XSLT,这是一个XML转换规范。请参阅此处如何在JavaScript中执行此操作:http://www.w3schools.com/xsl/xsl_client.asp