2011-02-25 148 views
19

我要的docx文件格式(這是OpenXML格式)轉換成JSON格式。我需要一些準則來做到這一點。提前致謝。轉換XML到JSON格式

回答

10

有XML和JSON之間沒有直接的映射; XML帶有類型信息(每個元素都有一個名稱)以及命名空間。因此,除非每個JSON對象都嵌入了類型信息,否則轉換將是有損的。

但是,這並不必然關係。重要的是JSON的消費者知道數據合同。例如,鑑於此XML:

<books> 
    <book author="Jimbo Jones" title="Bar Baz"> 
    <summary>Foo</summary> 
    </book> 
    <book title="Don't Care" author="Fake Person"> 
    <summary>Dummy Data</summary> 
    </book> 
</books> 

你可以將其轉換爲這樣的:

{ 
    "books": [ 
     { "author": "Jimbo Jones", "title": "Bar Baz", "summary": "Foo" }, 
     { "author": "Fake Person", "title": "Don't Care", "summary": "Dummy Data" }, 
    ] 
} 

而且消費者不需要知道該books集合中的每個對象是一個book對象。

編輯:

如果您對XML的XML Schema和使用.NET是,你可以生成類使用XSD.EXE架構。然後,您可以將源XML解析爲這些類的對象,然後使用DataContractJsonSerializer將這些類序列化爲JSON。

如果你沒有一個模式,這將是很難讓周圍手動定義自己的JSON格式。

+0

如何進行這種轉換。該輸入XML有些複雜,所以轉換必須易於並具有良好的performance..Which語言者優先做到這一點? – vignesh 2011-02-25 05:00:01

+2

這正是[XML-ValidatorBuddy(http://www.xml-tools.com/ValidatorBuddy.htm)可以 – Fluffi1974 2012-07-15 13:22:34

+0

你做雅各, 我用您的代碼示例,並已成功轉換的XML文件到一個JSON對象。但是,我的XML文件表示一個根元素()和一個分組元素(),其中所有其他元素都是嵌套的。該元素是什麼,我以後,它可以包含屬性,兒童和盛大子元素的任何變化等 有我來回報每元素的ArrayList 的方式。換句話說,我可以指定類似於XPath的東西,但仍然使用SAX? P.S:由於大小限制,我無法使用DOM。 – 2016-11-11 00:07:34

13

你可以看看的Json-lib Java庫,它提供XML到JSON的轉換。

String xml = "<hello><test>1.2</test><test2>123</test2></hello>"; 
XMLSerializer xmlSerializer = new XMLSerializer(); 
JSON json = xmlSerializer.read(xml); 

如果你需要根標籤太多,只需添加一個外部僞標籤:

String xml = "<hello><test>1.2</test><test2>123</test2></hello>"; 
XMLSerializer xmlSerializer = new XMLSerializer(); 
JSON json = xmlSerializer.read("<x>" + xml + "</x>"); 
+5

這將是很好的,但結果是'{ 「測試」: 「1.2」, 「TEST2」: 「123」}'和不'{ 「你好」:{ 「測試」: 「1.2」, 「TEST2」: 「123」}}',就是隻打印葉子(''標籤丟失)。如果我們添加一箇中間節點(''的子節點和''的父節點),則會發生同樣的情況:它將被忽略。這是配置問題嗎? – bluish 2011-04-13 11:55:16

4

如果您需要能夠操縱你的XML,然後纔會慢慢轉化爲JSON,或想細用XStream進行粒度控制。在xml-to-object,json-to-object,object-to-xml和object-to-json之間進行轉換非常簡單。下面是XStream's docs一個例子:

XML:

<person> 
    <firstname>Joe</firstname> 
    <lastname>Walnes</lastname> 
    <phone> 
    <code>123</code> 
    <number>1234-456</number> 
    </phone> 
    <fax> 
    <code>123</code> 
    <number>9999-999</number> 
    </fax> 
</person> 

POJO(DTO):

public class Person { 
    private String firstname; 
    private String lastname; 
    private PhoneNumber phone; 
    private PhoneNumber fax; 
    // ... constructors and methods 
} 

從XML轉換爲POJO:

String xml = "<person>...</person>"; 
XStream xstream = new XStream(); 
Person person = (Person)xstream.fromXML(xml); 

然後從POJO到JSON :

XStream xstream = new XStream(new JettisonMappedXmlDriver()); 
String json = xstream.toXML(person); 

注:儘管方法讀取toXML()由於使用了Jettison驅動程序,因此XStream將生成JSON。

4

轉換完成docx文件成JSON看起來並不像一個好主意,因爲DOCX是一個文檔爲中心的XML格式和JSON是一個以數據爲中心的格式。一般而言,XML旨在兼顧文檔和數據。雖然技術上可能將以文檔爲中心的XML轉換爲JSON,但處理生成的數據可能過於複雜。嘗試專注於實際需要的數據並僅轉換該部分。

6

org.json命名空間中的XML class爲您提供了此功能。

你必須調用靜態toJSONObject method

合式(但不一定有效)的XML字符串轉換成一個JSONObject。由於JSON是一種數據格式,XML是一種文檔格式,因此在這種轉換中可能會丟失一些信息。 XML使用元素,屬性和內容文本,而JSON使用名稱/值對和值數組的無序集合。 JSON並不喜歡區分元素和屬性。類似元素的序列表示爲JSONArrays。內容文本可以放在「內容」成員中。評論,序言,DTD和< [[]]>將被忽略。

+0

這絕對是最簡單和最乾淨的方法。謝謝。 – 2012-12-28 15:58:14

+0

我試圖使用它,但它創建了基於xml的Node/text。如何創建基於屬性的XML?例如:如果我的JSON數據是: {訂單:{訂單行:{的ItemID: 「1234」}},OrderNo: 「4567」} Reqrd O/P: <訂單OrderNo = 「4567」><訂單行的ItemID =「1234 「/>這是基於節點的。我正在查看屬性基礎xml轉換。請告訴我,如果您有任何建議。 – Aki 2013-01-27 15:08:02

6

如果您不滿意的各種實現方式,嘗試滾動自己。下面是我今天下午爲了讓你開始寫的一些代碼。它的工作原理與net.sf.json和Apache共郎鹹平:

static public JSONObject readToJSON(InputStream stream) throws Exception { 
    SAXParserFactory factory = SAXParserFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    SAXParser parser = factory.newSAXParser(); 
    SAXJsonParser handler = new SAXJsonParser(); 
    parser.parse(stream, handler); 
    return handler.getJson(); 
} 

而且SAXJsonParser實現:

package xml2json; 

import net.sf.json.*; 
import org.apache.commons.lang.StringUtils; 
import org.xml.sax.*; 
import org.xml.sax.helpers.DefaultHandler; 
import java.util.ArrayList; 
import java.util.List; 

public class SAXJsonParser extends DefaultHandler { 

    static final String TEXTKEY = "_text"; 

    JSONObject result; 
    List<JSONObject> stack; 

    public SAXJsonParser(){} 
    public JSONObject getJson(){return result;} 
    public String attributeName(String name){return "@"+name;} 

    public void startDocument() throws SAXException { 
     stack = new ArrayList<JSONObject>(); 
     stack.add(0,new JSONObject()); 
    } 
    public void endDocument() throws SAXException {result = stack.remove(0);} 
    public void startElement (String uri, String localName,String qName, Attributes attributes) throws SAXException { 
     JSONObject work = new JSONObject(); 
     for (int ix=0;ix<attributes.getLength();ix++) 
      work.put(attributeName(attributes.getLocalName(ix)), attributes.getValue(ix)); 
     stack.add(0,work); 
    } 
    public void endElement (String uri, String localName, String qName) throws SAXException { 
     JSONObject pop = stack.remove(0);  // examine stack 
     Object stashable = pop; 
     if (pop.containsKey(TEXTKEY)) { 
      String value = pop.getString(TEXTKEY).trim(); 
      if (pop.keySet().size()==1) stashable = value; // single value 
      else if (StringUtils.isBlank(value)) pop.remove(TEXTKEY); 
     } 
     JSONObject parent = stack.get(0); 
     if (!parent.containsKey(localName)) { // add new object 
      parent.put(localName, stashable); 
     } 
     else {         // aggregate into arrays 
      Object work = parent.get(localName); 
      if (work instanceof JSONArray) { 
       ((JSONArray)work).add(stashable); 
      } 
      else { 
       parent.put(localName,new JSONArray()); 
       parent.getJSONArray(localName).add(work); 
       parent.getJSONArray(localName).add(stashable); 
      } 
     } 
    } 
    public void characters (char ch[], int start, int length) throws SAXException { 
     JSONObject work = stack.get(0);   // aggregate characters 
     String value = (work.containsKey(TEXTKEY) ? work.getString(TEXTKEY) : ""); 
     work.put(TEXTKEY, value+new String(ch,start,length)); 
    } 
    public void warning (SAXParseException e) throws SAXException { 
     System.out.println("warning e=" + e.getMessage()); 
    } 
    public void error (SAXParseException e) throws SAXException { 
     System.err.println("error e=" + e.getMessage()); 
    } 
    public void fatalError (SAXParseException e) throws SAXException { 
     System.err.println("fatalError e=" + e.getMessage()); 
     throw e; 
    } 
} 
0

Docx4j

我以前用過docx4j,這是值得考慮看看。

unXml

您還可以看看我的開源unXml -library上可用Maven Central

它輕量級,並有一個簡單的語法從XML中挑出XPath,並讓它們返回爲JacksonObjectNode中的Json屬性。