Java odftoolkit,如何将从纯字符串创建的节点添加到 odf 文档中

Java odftoolkit, how to add node created from plain string into odf document

我有一个代码:

// -----------------------------------------------------------------

TextDocument resDoc = TextDocument.loadDocument( someInputStream );

Section section = resDoc.getSectionByName( "Section1" );  // this section does exist in the document

// create new node form String

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( new StringReader( fragment ) ) ).getDocumentElement();
node = section.getOdfElement().getOwnerDocument().importNode( node, true );

// append new node into section

section.getOdfElement().appendChild( node );

// -----------------------------------------------------------------

代码运行没有问题。但是结果文档的部分中没有任何内容。请知道如何将从字符串创建的新节点添加到 odf 文档中?

我从 odf-users 邮件组的 Svante Schubert 那里得到了一个解决方案:

诀窍是让 DocumentFactory 命名空间感知,此外, 将命名空间添加到您的文本片段。 详细信息正在更改:

旧:

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(new StringReader(片段))).getDocumentElement();

新:

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()))