簡體   English   中英

XML 到 JSON 轉換問題

[英]XML to JSON Conversion Issue

我有一個 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 模式生成 Java 類 2) 使用 Java 編譯器 API 編譯類 3) 通過 JAXB 解組類實例

但是都是繁重的IO操作。 有沒有辦法在內存中做到這一點?

您可以使用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"
   }
  ]
 }
}

免責聲明:我是Jsonix的作者,是一個用於 XML<->JS 轉換的模式驅動的JavaScript 庫。

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

  • 您可以從您的架構生成(JS)映射
  • 使用此映射將您的 XML 解組為 JSON
  • 將您的 JSON 編組為 XML

正如您所希望的那樣,Jsonix 是類型感知模式感知的

類型感知意味着您將在 JSON 中獲得一個字符串,其中包含xs:string和一個數字,其中包含xs:decimal等。Jsonix 支持幾乎所有內置的 XML 模式類型(以及您自己的從內置類型派生的簡單類型) -輸入類型)。

架構感知意味着您的 JSON 結構將嚴格基於您的 XML 架構的結構。 你會得到一個數組,你有一個可重復的元素等等。

適用於瀏覽器和 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' } ] }

編組的工作方式相同。

此示例的完整代碼可在此處獲得 它是用 Node.js/nodeunit 實現的,但 Jsonix 也可以在瀏覽器中運行。 (您沒有unarshalFile功能,但您可以執行unmarshalStringunmarshalDocument等。)

稍后我將發布一個 JSFiddle 示例。

幾個鏈接:

終於破解了這個——

對於 xml 到 json 轉換 -

  1. 解析 xml 模式 (JAXB) 並創建可以存儲在內存中的對象

  2. 根據創建的架構對象驗證 xml

  3. 使用模式類創建 xml 字符串的實例對象

  4. 使用該實例得出 json 字符串。

這樣 json 字符串將具有模式規定的數據類型。 例如 - 在模式中重復定義的特定元素將顯示為 json 數組,即使它在 xml 中的出現次數為 1(它不會被轉換為 json 對象)。 如果在架構中明確定義並且未隱式轉換為整數,則值為 123 的元素將被解釋為字符串。

如果有人想要它的代碼,請聯系我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM