[英]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似乎完全符合您的要求:
正如您所希望的那樣,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
功能,但您可以執行unmarshalString
或unmarshalDocument
等。)
稍后我將發布一個 JSFiddle 示例。
幾個鏈接:
終於破解了這個——
對於 xml 到 json 轉換 -
解析 xml 模式 (JAXB) 並創建可以存儲在內存中的對象
根據創建的架構對象驗證 xml
使用模式類創建 xml 字符串的實例對象
使用該實例得出 json 字符串。
這樣 json 字符串將具有模式規定的數據類型。 例如 - 在模式中重復定義的特定元素將顯示為 json 數組,即使它在 xml 中的出現次數為 1(它不會被轉換為 json 對象)。 如果在架構中明確定義並且未隱式轉換為整數,則值為 123 的元素將被解釋為字符串。
如果有人想要它的代碼,請聯系我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.