2

XML ファイルを org.w3c.dom.Document に読み込み、getElementsByTagName でノードを見つけ、この方法で他のドキュメントから子を追加します。

foundNode.appendChild(document.adoptNode(othersDocumentNode.cloneNode(true)));

その後、結果を StringWriter に保存します。

Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "20");
transformer.transform(
    new DOMSource(document),
    new StreamResult(out)
);

その結果、次のようなドキュメントが得られます。

<document>
                   <foundNode>
<nestedContent>
  <content/>
</nestedContent>
                   </foundonde>
</document>

つまり、フォーマットはネストされたコンテンツには影響しません。すべてのドキュメントをフォーマットしたいと思います。どうすればこれを達成できますか?

ありがとう

4

2 に答える 2

0

出力インデントの効果は、実装定義であると指定されています。あるプロセッサーの処理方法が気に入らない場合は、いつでも別のプロセッサーを試すことができます (この場合は、Saxon を試すことを意味します)。

于 2012-07-29T12:46:40.937 に答える
0

<foundNode> の最初の子は、改行だけを含むテキスト ノードであることに気付くでしょう。通常、テキスト ノードは、a) 行の改行と b) 適切なインデントの挿入で構成される自動インデンターの作業を妨げます。もちろん、これは独自のテキスト ノードを挿入することによって行われます。そのため、インデンターが通常、既存のテキスト ノードの存在下でインデントしないように記述される理由がわかります。

ただし、改行が保持されているため、インデント幅の構成を尊重していないことを除けば、インデンターが機能しているように見えます。

この問題を解決するためにできることは、タスクのより広いコンテキストによって少し異なります。たとえば、ネストされたコンテンツから空白テキスト ノードを再帰的にトリミングできます。

private static void removeWhitespace(Element el) {
    NodeList nl = el.getChildNodes();
    for (int i = 0; i < nl.getLength(); i++) {
        Node n = nl.item(i);
        if (n.getNodeType() == Node.TEXT_NODE) {
            String text = n.getTextContent();
            String trimmed = text.trim();
            if (trimmed.isEmpty())
                el.removeChild(n);
            else if (trimmed.length() < text.length())
                n.setTextContent(trimmed);
        }
        if (n.getNodeType() == Node.ELEMENT_NODE)
            removeWhitespace((Element) n);
    }
}

(注: これは単純な例です。テキスト ノードにペイロード データがないことがわかっている場合に機能します。)

他のドキュメントを解析するときにDocumentBuilderFactory.setIgnoringElementContentWhitespaceを呼び出すのは一見魅力的に見えるかもしれませんが、JavaDoc で説明されている制約に注意してください。

于 2012-07-29T13:34:12.257 に答える