我想将XML转换为JSON(具体来说,是OAI-PMH响应)。我目前正在使用node.js xml2js,但问题是JSON非常冗长,有很多级别的嵌套和数组,即使只有一个元素作为子元素,也永远不会超过一个。问题是xml2js
对XML文件的架构一无所知,所以它必须保守。
我的问题是,是否还有其他(最好是JavaScript)代码可以使用XML Schema来指导转换过程?因此,如果schema定义了XML的类型和结构,那么JSON就会利用它并自动拥有正确的类型,而不是不必要的数组级别。
答案 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解决方案。
xjc
的解决方案: Convert xml to json with Java。使用xjc
,可以从XML Schema创建Java类,并使用JAXB工具读取不同格式的写出数据。
答案 4 :(得分:-3)
XML模式用于XML验证。无法使用XML架构转换任何内容。模式定义XML文档的结构。如果你想转换某些内容,你需要一个XSLT,这是一个XML转换规范。请参阅此处如何在JavaScript中执行此操作:http://www.w3schools.com/xsl/xsl_client.asp