У меня есть решение от Сванте Шуберта из группы рассылки odf-пользователей:
Хитрость заключается в том, чтобы сделать пространство имен DocumentFactory осведомленным и, кроме того,
добавьте пространство имен к вашему текстовому фрагменту.
Подробно это меняется:
OLD:
String fragment = "<text:p text:style-name=\"P13\"><text:span text:style-name=\"T1\">Test</text:span></text:p>";
Node node = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new
InputSource (новый StringReader (фрагмент))). GetDocumentElement ();
NEW:
String fragment = "<text:p xmlns:text=\"urn:oasis:names:tc:opendocument:xmlns:text:1.0\" text:style-name=\"P13\"><text:span text:style-name=\"T1\">Test</text:span></text:p>";
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Итак, на основании его находки я придумал метод:
private Node importNodeFromString( String fragment, Document ownerDokument ) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware( true );
Node node;
try {
node = dbf.newDocumentBuilder().parse( new InputSource( new StringReader( fragment ) ) ).getDocumentElement();
}
catch ( SAXException | IOException | ParserConfigurationException e ) {
throw new RuntimeException( e );
}
node = ownerDokument.importNode( node, true );
return node;
}
Может использоваться как:
section.getOdfElement().appendChild(importNodeFromString(fragmment, section.getOdfElement().getOwnerDocument()))