Мне нужно преобразовать формат файла docx (который находится в формате openXML) в формат JSON. Мне нужны некоторые рекомендации для этого. Спасибо заранее.
Преобразование XML в формат JSON
Ответ 1
Вы можете ознакомиться с библиотекой Java Json-lib, которая обеспечивает преобразование XML-to-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>");
Ответ 2
Не существует прямого сопоставления между 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
.
Edit:
Если у вас есть XML-схема для XML и используется .NET, вы можете создавать классы из схемы с помощью xsd.exe. Затем вы можете проанализировать исходный XML в объектах этих классов, а затем использовать DataContractJsonSerializer
для сериализации классов как JSON.
Если у вас нет схемы, вам будет сложно вручную определить ваш формат JSON.
Ответ 3
класс XML в пространстве имен org.json предоставляет вам эту функциональность.
Вы должны вызвать статический метод toJSONObject
Преобразует корректную (но не обязательно корректную) XML-строку в JSONObject. Некоторая информация может быть потеряна при этом преобразовании, поскольку JSON - это формат данных, а XML - формат документа. XML использует элементы, атрибуты и текст контента, в то время как JSON использует неупорядоченные коллекции пар имя/значение и массивы значений. JSON не любит различать элементы и атрибуты. Последовательности подобных элементов представлены как JSONArrays. Текст содержания может быть помещен в "контент". Комментарии, прологи, DTD и < [[]] > игнорируются.
Ответ 4
Если вы недовольны различными реализациями, попробуйте перевести их самостоятельно. Вот какой код я написал сегодня днем, чтобы вы начали. Он работает с net.sf.json и apache common-lang:
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;
}
}
Ответ 5
Если вам нужно управлять вашим XML до того, как он будет преобразован в JSON, или хотите получить мелкий контроль над вашим представлением, перейдите в XStream. Очень легко преобразовать между: xml-to-object, json-to-object, object-to-xml и object-to-json. Вот пример из XStream 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()
XStream будет создавать JSON, так как используется драйвер Jettison.
Ответ 6
Преобразование полных файлов docx в JSON не выглядит хорошей идеей, потому что docx - это XML-формат, ориентированный на документ, а JSON - это ориентированный на данные формат. XML в целом предназначен как для документооборота, так и для данных. Хотя технически возможно преобразовать XML-документ в JSON, обработка сгенерированных данных может быть чрезмерно сложной. Попытайтесь сосредоточиться на фактических необходимых данных и преобразовать только эту часть.
Ответ 7
Если у вас есть действительный файл dtd для фрагмента xml, то вы можете легко конвертировать xml в json и json в xml, используя jar ссылки затмения с открытым исходным кодом. Подробный пример проекта JAVA можно найти здесь: http://www.cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html
Ответ 8
Я познакомился с учебником, надеюсь, что это поможет вам. http://www.techrecite.com/xml-to-json-data-parser-converter
Ответ 9
docx4j
Раньше я использовал docx4j, и стоит взглянуть на него.
unXml
Вы также можете проверить мой открытый источник unXml - библиотека, доступная на Maven Central.
Он легкий и имеет простой синтаксис для выбора XPaths из вашего xml и возвращает их в качестве атрибутов Json в Jackson ObjectNode
.
Ответ 10
Используйте xmlSerializer.setForceTopLevelObject(true), чтобы включить корневой элемент в полученный JSON.
Ваш код будет таким
String xml = "<hello><test>1.2</test><test2>123</test2></hello>";
XMLSerializer xmlSerializer = new XMLSerializer();
xmlSerializer.setForceTopLevelObject(true);
JSON json = xmlSerializer.read(xml);