【问题标题】:XML to JSON Conversion IssueXML 到 JSON 转换问题
【发布时间】:2014-11-26 01:17:33
【问题描述】:

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

【问题讨论】:

    标签: java xml json xsd xjc


    【解决方案1】:

    您可以使用http://www.xsd2xml.com/ 从您的 xsd 生成示例 xml,然后您可以使用站点: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"
       }
      ]
     }
    }
    

    【讨论】:

    • 尝试输入 1234 作为 xsd 中任何元素的值。您会注意到该元素的转换后的 json 变成了一个整数,而不是一个字符串。无论如何,我的要求是我以编程方式执行此操作......所以希望你能指出我正确的方向!
    • 如果你想通过java编码来实现,我推荐使用库:gsonlink和JAXB。 gson 帮助您将 java obejcts 转换为 json。 JAXB 将帮助您将 XML 更改为 java obecjts (unmarshall)。
    • 我想将 xml 转换为 json 相对于模式,以便数据类型和 JSON 对象和数组与元素定义保持一致。请帮忙
    【解决方案2】:

    免责声明:我是Jsonix 的作者,这是一个模式驱动用于 XMLJS 转换的 JavaScript 库。

    Jsonix 似乎完全符合您的要求:

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

    正如您所愿,Jsonix 是 type-awareschema-aware

    类型感知意味着您将在 JSON 中获得一个包含 xs:string 的字符串和一个包含 xs:decimal 等的数字。Jsonix 支持几乎所有内置的 XML Schema 类型(以及您自己的简单类型)派生自内置类型)。

    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 的示例。

    几个链接:

    【讨论】:

      【解决方案3】:

      终于破解了——

      用于 xml 到 json 的转换 -

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

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

      3. 根据架构类创建 xml 字符串的实例对象

      4. 使用该实例生成 json 字符串。

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

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

      【讨论】:

        猜你喜欢
        • 2014-03-27
        • 1970-01-01
        • 1970-01-01
        • 2014-12-18
        • 1970-01-01
        • 2013-03-09
        • 1970-01-01
        • 2014-11-24
        • 1970-01-01
        相关资源
        最近更新 更多