我有一个xml架构 -
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.tibco.com/schemas/RegTestingStub/SharedResources/SchemaDefinitions/CommonXSD/Schema.xsd2"
targetNamespace="http://www.tibco.com/schemas/RegTestingStub/SharedResources/SchemaDefinitions/CommonXSD/Schema.xsd2"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="AccumulateResponse" type="AccumulateResponse"/>
<xs:complexType name="AccumulateResponse">
<xs:sequence>
<xs:element name="TestCase" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Transactionid" type="xs:string"/>
<xs:element name="TransactionType" type="xs:string"/>
<xs:element name="Status" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
我正在按照以下步骤进行此转换 - 1)使用XJC从XML Schema生成Java类 2)使用Java Compiler API编译类 3)通过JAXB解组类实例
但他们都是繁重的IO操作。有没有办法在记忆中做到这一点?
答案 0 :(得分:1)
您可以使用http://www.xsd2xml.com/从xsd生成示例xml,之后您可以使用site:http://www.utilities-online.info/xmltojson/将xml转换为json。
对于你的xsd,我得到了样本xml:
<?xml version="1.0" encoding="utf-8"?>
<AccumulateResponse>
<TestCase>
<Transactionid>str1234</Transactionid>
<TransactionType>str1234</TransactionType>
<Status>str1234</Status>
</TestCase>
<TestCase>
<Transactionid>str5678</Transactionid>
<TransactionType>str5678</TransactionType>
<Status>str5678</Status>
</TestCase>
</AccumulateResponse>
使用我得到的第二个网站:
{
"AccumulateResponse": {
"TestCase": [
{
"Transactionid": "str1234",
"TransactionType": "str1234",
"Status": "str1234"
},
{
"Transactionid": "str5678",
"TransactionType": "str5678",
"Status": "str5678"
}
]
}
}
答案 1 :(得分:1)
免责声明:我是Jsonix的作者,这是一个用于XML&lt; - &gt; JS转换的模式驱动的 JavaScript库。
Jsonix似乎完全符合您的要求:
正如您所希望的那样,Jsonix是类型感知和架构感知。
类型感知意味着您将在JSON中获得一个字符串,其中包含xs:string
和一个数字,其中包含xs:decimal
等.Jsonix支持几乎所有内置的XML模式类型(如以及从内置类型派生的您自己的简单类型。)
Schema-aware意味着您的JSON结构将严格基于XML Schema的结构。您将获得具有可重复元素的数组,依此类推。
适用于浏览器以及Node.js,与AMD以及CJS环境兼容。
好的,有足够的话,让代码说话。
我们采用以下架构(我已将文件命名为ar.xsd
):
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="urn:test"
targetNamespace="urn:test"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="AccumulateResponse" type="AccumulateResponse"/>
<xs:complexType name="AccumulateResponse">
<xs:sequence>
<xs:element name="TestCase" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="TransactionId" type="xs:string"/>
<xs:element name="TransactionType" type="xs:string"/>
<xs:element name="Status" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
(我刚刚修改了一个元素名称和名称空间。)
我们首先使用Jsonix架构编译器生成映射文件:
java -jar jsonix-schema-compiler-full.jar ar.xsd -p AR
我们从中得到的是一个名为AR.js
的映射文件,它定义了XML-JSON映射。这就是映射定义的样子:
{
name: 'AR',
defaultElementNamespaceURI: 'urn:test',
typeInfos: [{
localName: 'AccumulateResponse',
propertyInfos: [{
name: 'testCase',
collection: true,
elementName: 'TestCase',
typeInfo: '.AccumulateResponse.TestCase'
}]
}, {
localName: 'AccumulateResponse.TestCase',
propertyInfos: [{
name: 'transactionId',
elementName: 'TransactionId'
}, {
name: 'transactionType',
elementName: 'TransactionType'
}, {
name: 'status',
elementName: 'Status'
}]
}],
elementInfos: [{
elementName: 'AccumulateResponse',
typeInfo: '.AccumulateResponse'
}]
}
(还有一种紧凑模式,您可以使用en
而不是elementName
来获得真正的短名称。)
接下来是一个要测试的XML示例(sample01.xml
):
<?xml version="1.0" encoding="utf-8"?>
<AccumulateResponse xmlns="urn:test">
<TestCase>
<Transactionid>1234</Transactionid>
<TransactionType>5678</TransactionType>
<Status>Status01</Status>
</TestCase>
<TestCase>
<Transactionid>true</Transactionid>
<TransactionType>false</TransactionType>
<Status>Status02</Status>
</TestCase>
</AccumulateResponse>
这是一个解组测试用例(ar-tests.js
):
var Jsonix = require('jsonix').Jsonix;
var AR = require('../AR').AR;
// Create Jsonix context
var context = new Jsonix.Context([ AR ]);
// Create unmarshaller
var unmarshaller = context.createUnmarshaller();
// Unmarshal the XML file
unmarshaller.unmarshalFile( 'tests/sample01.xml',
function(element) {
console.log(element.value);
test.equal('Status01', element.value.testCase[0].status);
test.done();
});
这就是你在控制台中得到的结果:
{ TYPE_NAME: 'AR.AccumulateResponse',
testCase:
[ { TYPE_NAME: 'AR.AccumulateResponse.TestCase',
transactionType: '5678',
status: 'Status01' },
{ TYPE_NAME: 'AR.AccumulateResponse.TestCase',
transactionType: 'false',
status: 'Status02' } ] }
编组工作方式相同。
此示例的完整代码可用here。它使用Node.js / nodeunit实现,但Jsonix也可以在浏览器中使用。 (您没有unarshalFile
功能,但可以执行unmarshalString
或unmarshalDocument
等。
我稍后会发布一个JSFiddle的例子。
很少有链接:
答案 2 :(得分:0)
最后破解了这个 -
对于xml到json的转换 -
解析xml架构(JAXB)并创建可存储在内存中的对象
根据创建的架构对象验证xml
创建xml字符串的实例对象w.r.t架构类
使用该实例提供json字符串。
这样,json字符串将具有模式所指示的数据类型。例如。 - 在模式中重复定义的特定元素将显示为json数组,即使它在xml中出现为1(它也不会转换为json对象)。如果在模式中显式定义并且未隐式转换为整数,则具有值123的元素将被解释为字符串。
如果有人想要代码,请与我联系。