2011-02-25 151 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属性。