XML到JSON转换问题

时间:2014-10-01 08:36:00

标签: java xml json xsd xjc

我有一个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操作。有没有办法在记忆中做到这一点?

3 个答案:

答案 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似乎完全符合您的要求:

  • 您可以从架构生成(JS)映射
  • 使用此映射将XML解组为JSON
  • 将您的JSON编组为XML

正如您所希望的那样,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功能,但可以执行unmarshalStringunmarshalDocument等。

我稍后会发布一个JSFiddle的例子。

很少有链接:

答案 2 :(得分:0)

最后破解了这个 -

对于xml到json的转换 -

  1. 解析xml架构(JAXB)并创建可存储在内存中的对象

  2. 根据创建的架构对象验证xml

  3. 创建xml字符串的实例对象w.r.t架构类

  4. 使用该实例提供json字符串。

  5. 这样,json字符串将具有模式所指示的数据类型。例如。 - 在模式中重复定义的特定元素将显示为json数组,即使它在xml中出现为1(它也不会转换为json对象)。如果在模式中显式定义并且未隐式转换为整数,则具有值123的元素将被解释为字符串。

    如果有人想要代码,请与我联系。