#java #xml #docx4j
#java #xml #docx4j
Вопрос:
Я использую библиотеку Java Docx4j для преобразования файла .docx в его представление .xml, сохранения XML в базе данных, а затем преобразования XML обратно в файл .docx.
Пока я могу успешно преобразовать файл .docx в XML и сохранить его в базе данных. Однако у меня возникают проблемы с преобразованием этого XML обратно в форму .docx. Я все равно не редактирую XML. Если я открою XML-файл в Word, он будет отображаться нормально.
String inputFilePath = args[0];
WordprocessingMLPackage wmlPackage = Docx4J.load(new File(inputFilePath));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Docx4J.save(wmlPackage, baos, Docx4J.FLAG_SAVE_FLAT_XML);
DatabaseController databaseController = new DatabaseController();
databaseController.commitXMLToDatabase(baos, "file-sample_1MB"); // Add the XML and filename to DB
String xml = databaseController.retrieveDocument("file-sample_1MB");
// Issue with the code below:
WordprocessingMLPackage testPkg = WordprocessingMLPackage.createPackage();
testPkg.getMainDocumentPart().unmarshal(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)));
testPkg.save(new File("src/main/resources/test1.docx"));
Я получаю сообщение об ошибке ниже (я удалил некоторые из перечисленных URL-адресов схемы)
Exception in thread "main" javax.xml.bind.JAXBException
- with linked exception:
[javax.xml.bind.UnmarshalException
- with linked exception:
[com.sun.istack.SAXParseException2; lineNumber: 1; columnNumber: 133; unexpected element (uri:"http://schemas.microsoft.com/office/2006/xmlPackage", local:"package"). Expected elements are <{urn:schemas-microsoft-com:office:excel}ClientData>,<{http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing}wsDr>,<{}xml>,<{http://opendope.org/xpaths}xpath>,<{http://opendope.org/conditions}xpathref>,<{http://opendope.org/xpaths}xpaths>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}yearLong>,<{http://schemas.openxmlformats.org/wordprocessingml/2006/main}yearShort>]]
at org.docx4j.openpackaging.parts.JaxbXmlPartXPathAware.unmarshal(JaxbXmlPartXPathAware.java:586)
at org.docx4j.openpackaging.parts.JaxbXmlPartXPathAware.unmarshal(JaxbXmlPartXPathAware.java:346)
at DocxToXML.main(DocxToXML.java:37)
Caused by: javax.xml.bind.UnmarshalException
Буду признателен за любую помощь. Я могу опубликовать файлы .docx и .xml, если они могут помочь.
Ответ №1:
Исправлено. Код, который я использую сейчас, следующий:
// retrieveDocument() gets the data from DB Blob as a byte[] Array
// and returns an InputStream
InputStream xml = databaseController.retrieveDocument("Test1");
WordprocessingMLPackage pkg = Docx4J.load(xml);
Docx4J.save(pkg, new File("src/main/resources/output/test1.docx"));