Thanks mikhall, it works !
I wrote a Java Class converting ODT to FlatXML using DOM in the meantime.
See bellow:
package com.versusoft.packages.ooo;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import org.w3c.dom.Element;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
*
* @author vince
*/
public class OdtUtils {
public static void ODTtoFlatXML(String fileIn, String fileOut) throws
IOException, ParserConfigurationException, SAXException,
TransformerConfigurationException, TransformerException {
ZipFile zf = null;
zf = new ZipFile(fileIn);
ZipEntry metaEntry = zf.getEntry("meta.xml");
ZipEntry stylesEntry = zf.getEntry("styles.xml");
ZipEntry contentEntry = zf.getEntry("content.xml");
ZipEntry settingsEntry = zf.getEntry("settings.xml");
DocumentBuilderFactory docFactory =
DocumentBuilderFactory.newInstance();
docFactory.setValidating(false);
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
docBuilder.setEntityResolver(new EntityResolver() {
public InputSource resolveEntity(java.lang.String publicId,
java.lang.String systemId)
throws SAXException, java.io.IOException {
return new InputSource(new ByteArrayInputStream("<?xml
version='1.0' encoding='UTF-8'?>".getBytes()));
}
});
Document doc = docBuilder.newDocument();
Element racine = doc.createElement("office:document");
Document metaDoc = docBuilder.parse(zf.getInputStream(metaEntry));
Document stylesDoc =
docBuilder.parse(zf.getInputStream(stylesEntry));
Document contentDoc =
docBuilder.parse(zf.getInputStream(contentEntry));
Document settingsDoc =
docBuilder.parse(zf.getInputStream(settingsEntry));
String parentPath = new File(fileIn).getParent();
System.out.println("path=" + parentPath);
replaceObjectContent(docBuilder, contentDoc, zf, parentPath);
racine.setAttribute("xmlns:meta",
"urn:oasis:names:tc:opendocument:xmlns:meta:1.0");
racine.setAttribute("xmlns:xsl", "
http://www.w3.org/1999/XSL/Transform");
racine.setAttribute("xmlns:office",
"urn:oasis:names:tc:opendocument:xmlns:office:1.0");
racine.setAttribute("xmlns:style",
"urn:oasis:names:tc:opendocument:xmlns:style:1.0");
racine.setAttribute("xmlns:text",
"urn:oasis:names:tc:opendocument:xmlns:text:1.0");
racine.setAttribute("xmlns:table",
"urn:oasis:names:tc:opendocument:xmlns:table:1.0");
racine.setAttribute("xmlns:draw",
"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0");
racine.setAttribute("xmlns:fo",
"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0");
racine.setAttribute("xmlns:meta",
"urn:oasis:names:tc:opendocument:xmlns:meta:1.0");
racine.setAttribute("xmlns:number",
"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0");
racine.setAttribute("xmlns:svg",
"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0");
racine.setAttribute("xmlns:chart",
"urn:oasis:names:tc:opendocument:xmlns:chart:1.0");
racine.setAttribute("xmlns:dr3d",
"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0");
racine.setAttribute("xmlns:form",
"urn:oasis:names:tc:opendocument:xmlns:form:1.0");
racine.setAttribute("xmlns:script",
"urn:oasis:names:tc:opendocument:xmlns:script:1.0");
racine.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
racine.setAttribute("xmlns:dc", "http://purl.org/dc/elements/1.1/");
racine.setAttribute("xmlns:math", "
http://www.w3.org/1998/Math/MathML");
racine.setAttribute("xmlns:dom", "http://www.w3.org/2001/xml-events
");
racine.setAttribute("xmlns:xforms", "http://www.w3.org/2002/xforms
");
racine.setAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema
");
racine.setAttribute("xmlns:xsi", "
http://www.w3.org/2001/XMLSchema-instance");
racine.setAttribute("xmlns:config",
"urn:oasis:names:tc:opendocument:xmlns:config:1.0");
NodeList nodelist = metaDoc.getDocumentElement().getChildNodes();
for (int i = 0; i < nodelist.getLength(); i++) {
racine.appendChild(doc.importNode(nodelist.item(i), true));
}
nodelist = settingsDoc.getDocumentElement().getChildNodes();
for (int i = 0; i < nodelist.getLength(); i++) {
racine.appendChild(doc.importNode(nodelist.item(i), true));
}
nodelist = stylesDoc.getDocumentElement().getChildNodes();
for (int i = 0; i < nodelist.getLength(); i++) {
racine.appendChild(doc.importNode(nodelist.item(i), true));
}
nodelist = contentDoc.getDocumentElement().getChildNodes();
for (int i = 0; i < nodelist.getLength(); i++) {
racine.appendChild(doc.importNode(nodelist.item(i), true));
}
doc.appendChild(racine);
Transformer transformer =
TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
StreamResult result = new StreamResult(fileOut);
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
}
private static void replaceObjectContent(
DocumentBuilder docBuilder, Document contentDoc, ZipFile zf,
String parentPath) throws IOException, SAXException {
Element root = contentDoc.getDocumentElement();
NodeList nodelist = root.getElementsByTagName("draw:object");
for (int i = 0; i < nodelist.getLength(); i++) {
Node objectNode = nodelist.item(i);
Node hrefNode =
objectNode.getAttributes().getNamedItem("xlink:href");
String objectPath = hrefNode.getTextContent();
System.out.println("object path=" + objectPath);
Document objectDoc =
docBuilder.parse(zf.getInputStream(zf.getEntry(objectPath.substring(2) +
System.getProperty("file.separator") + "content.xml")));
Node objectContentNode = objectDoc.getDocumentElement();
String tagName = objectContentNode.getNodeName();
System.out.println(tagName);
if (tagName.equals("math:math")) {
System.out.println("replacing math");
Node newObjectNode =
contentDoc.createElement("draw:object");
newObjectNode.appendChild(contentDoc.importNode(objectContentNode, true));
//newObjectNode.appendChild(objectContentNode);
//contentDoc.insertBefore(objectContentNode, objectNode);
//contentDoc.removeChild(objectNode);
//contentDoc.replaceChild(newObjectNode, objectNode);
//replaceNode(contentDoc,objectDoc,newObjectNode.getFirstChild());
objectNode.getParentNode().replaceChild(newObjectNode,objectNode);
}
}
}
public static void main(String args[]) throws IOException {
try {
OdtUtils.ODTtoFlatXML(args[0], args[1]);
} catch (ParserConfigurationException ex) {
ex.printStackTrace();
} catch (SAXException ex) {
ex.printStackTrace();
} catch (TransformerConfigurationException ex) {
ex.printStackTrace();
} catch (TransformerException ex) {
ex.printStackTrace();
}
}
}
On Tue, Apr 8, 2008 at 9:58 AM, Mikhail Voitenko <[EMAIL PROTECTED]>
wrote:
> Hi Vincent,
>
> I assume that using of "com.sun.star.comp.Writer.XMLOasisExporter" instead
> of "com.sun.star.comp.Writer.XMLExporter" would let the ODT XML format be
> used.
>
> Best regards,
> Mikhail.
>
>
> Vincent Spiewak wrote:
>
> > Hi all
> > I want to store an ODT "Flat XML" of the current document.
> > I tried this code from "SAXEcho" project:
> >
> >
> >
> > DocumentCollector collector = new DocumentCollector(false);
> >
> > // get the xmlexportfilter service
> > XMultiComponentFactory m_xMCF =
> > m_xContext.getServiceManager();
> >
> > Object xmlExporter = null;
> >
> > xmlExporter =
> > m_xMCF.createInstanceWithContext("com.sun.star.comp.Writer.XMLExporter",
> > m_xContext);
> >
> > // get the interface of xmlexportfilter service
> > XFilter xFilter = (XFilter)
> > UnoRuntime.queryInterface(XFilter.class, xmlExporter);
> > XExporter xExporter = (XExporter)
> > UnoRuntime.queryInterface(XExporter.class, xmlExporter);
> > XInitialization xInitialization =
> > (XInitialization)
> > UnoRuntime.queryInterface(XInitialization.class, xmlExporter);
> >
> > Object args[] = new Object[1];
> > args[0] = (com.sun.star.xml.sax.XDocumentHandler)
> > UnoRuntime.queryInterface(
> > com.sun.star.xml.sax.XDocumentHandler.class,
> > collector);
> >
> > xInitialization.initialize(args);
> >
> > // get the Desktop service
> > Object desktop = m_xMCF.createInstanceWithContext(
> > "com.sun.star.frame.Desktop", m_xContext);
> >
> > XDesktop xDesktop = (XDesktop) UnoRuntime.queryInterface(
> > XDesktop.class, desktop);
> >
> > // set the xcomponent
> > xExporter.setSourceDocument(xDesktop.getCurrentComponent());
> >
> > // start the filter
> > xFilter.filter(new PropertyValue[0]);
> >
> > Document root = collector.getDocument();
> >
> > AdapterNode adapter = new AdapterNode(root, null);
> >
> > // saving...
> > FileOutputStream fos = new FileOutputStream(tmpUrl);
> > DocumentDistributor.setFormatting(false);
> > DocumentDistributor.parseNode(adapter.getNode(), fos, null);
> > fos.close();
> >
> >
> > It works great but give a SXW Flat XML, NOT ODT.
> > Is there a similar way to export in ODT Flat XML ?
> > Instead, is there any Java Toolkit like AODL ?
> >
> >
> > ----------------------------------------------------------
> > - Vincent Spiewak - www.versusoft.com -
> > ----------------------------------------------------------
> >
> >
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
--
----------------------------------------------------------
- Vincent Spiewak - www.versusoft.com -
----------------------------------------------------------