Je dois convertir le format de fichier docx (qui est au format openXML) au format JSON. J'ai besoin de quelques directives pour le faire. Merci d'avance.
Vous pouvez jeter un œil à la bibliothèque Json-lib Java, qui fournit la conversion XML-JSON.
String xml = "<hello><test>1.2</test><test2>123</test2></hello>";
XMLSerializer xmlSerializer = new XMLSerializer();
JSON json = xmlSerializer.read( xml );
Si vous avez également besoin de la balise racine, ajoutez simplement une balise factice externe:
String xml = "<hello><test>1.2</test><test2>123</test2></hello>";
XMLSerializer xmlSerializer = new XMLSerializer();
JSON json = xmlSerializer.read("<x>" + xml + "</x>");
Il n'y a pas de mappage direct entre XML et JSON; XML contient des informations de type (chaque élément a un nom) ainsi que des espaces de noms. Par conséquent, à moins que chaque objet JSON ait des informations de type incorporées, la conversion va être avec perte.
Mais cela n'a pas forcément d'importance. Ce qui importe, c'est que le consommateur du JSON connaisse le contrat de données. Par exemple, étant donné ce 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>
Vous pouvez le convertir en ceci:
{
"books": [
{ "author": "Jimbo Jones", "title": "Bar Baz", "summary": "Foo" },
{ "author": "Fake Person", "title": "Don't Care", "summary": "Dummy Data" },
]
}
Et le consommateur n'aurait pas besoin de savoir que chaque objet de la collection books
était un objet book
.
Modifier:
Si vous avez un schéma XML pour le XML et utilisez .NET, vous pouvez générer des classes à partir du schéma à l'aide de xsd.exe. Ensuite, vous pouvez analyser le XML source en objets de ces classes, puis utiliser un DataContractJsonSerializer
pour sérialiser les classes en JSON.
Si vous n'avez pas de schéma, il sera difficile de vous déplacer manuellement pour définir votre format JSON vous-même.
classe XML dans l'espace de noms org.json vous offre cette fonctionnalité.
Vous devez appeler la statique méthode toJSONObject
Convertit une chaîne XML bien formée (mais pas nécessairement valide) en JSONObject. Certaines informations peuvent être perdues dans cette transformation car JSON est un format de données et XML est un format de document. XML utilise des éléments, des attributs et du texte de contenu, tandis que JSON utilise des collections non ordonnées de paires nom/valeur et des tableaux de valeurs. JSON n'aime pas faire la distinction entre les éléments et les attributs. Les séquences d'éléments similaires sont représentées sous forme de tableaux JSON. Le texte du contenu peut être placé dans un membre "contenu". Les commentaires, prologues, DTD et <[[]]> sont ignorés.
Si vous n'êtes pas satisfait des différentes implémentations, essayez de lancer la vôtre. Voici un code que j'ai écrit cet après-midi pour vous aider à démarrer. Il fonctionne avec net.sf.json et 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();
}
Et l'implémentation 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;
}
}
Si vous devez être en mesure de manipuler votre XML avant qu'il ne soit converti en JSON, ou si vous souhaitez un contrôle précis de votre représentation, optez pour XStream. Il est très facile de convertir entre: xml-to-object, json-to-object, object-to-xml et object-to-json. Voici un exemple de documents de XStream :
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
}
Convertir de XML en POJO:
String xml = "<person>...</person>";
XStream xstream = new XStream();
Person person = (Person)xstream.fromXML(xml);
Et puis de POJO à JSON:
XStream xstream = new XStream(new JettisonMappedXmlDriver());
String json = xstream.toXML(person);
Remarque: bien que la méthode indique toXML()
XStream produira JSON, puisque le pilote Jettison est utilisé.
La conversion de fichiers docx complets en JSON ne semble pas une bonne idée, car docx est un format XML centré sur les documents et JSON est un format centré sur les données. XML en général est conçu pour être à la fois centré sur les documents et les données. Bien qu'il soit techniquement possible de convertir du XML centré sur un document en JSON, la gestion des données générées peut être trop complexe. Essayez de vous concentrer sur les données réellement nécessaires et convertissez uniquement cette partie.
Si vous avez un fichier dtd valide pour l'extrait xml, vous pouvez facilement convertir xml en json et json en xml en utilisant le pot de lien Eclipse open source. Exemple détaillé Java peut être trouvé ici: http://www.cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format. html
J'ai rencontré un tutoriel, j'espère qu'il vous aidera. http://www.techrecite.com/xml-to-json-data-parser-converter
Docx4j
J'ai utilisé docx4j avant, et ça vaut le coup d'y jeter un œil.
unXml
Vous pouvez également consulter mon open source nXml - bibliothèque disponible sur Maven Central .
Il est léger et possède une syntaxe simple pour sélectionner les XPath de votre xml et les renvoyer en tant qu'attributs Json dans un JacksonObjectNode
.
Utilisation xmlSerializer.setForceTopLevelObject (true) pour inclure l'élément racine dans le JSON résultant.
Votre code serait comme ça
String xml = "<hello><test>1.2</test><test2>123</test2></hello>";
XMLSerializer xmlSerializer = new XMLSerializer();
xmlSerializer.setForceTopLevelObject(true);
JSON json = xmlSerializer.read(xml);