9

ファイルを読み取って DOM ドキュメントを生成しようとしていますが、ファイルに空白と改行が含まれており、それらを無視しようとしていますが、できませんでした:

DocumentBuilderFactory docfactory=DocumentBuilderFactory.newInstance();
docfactory.setIgnoringElementContentWhitespace(true);

setIgnoringElementContentWhitespace メソッドは、検証フラグが有効になっている場合にのみ動作することが Javadoc でわかりますが、ドキュメントの DTD または XML スキーマがありません。

私に何ができる?

アップデート

mySelf < !ELEMENT... 宣言を導入するという考えが気に入らず、 Tomalak が指摘するフォーラムで提案された解決策を試しましたが、うまくいきません。Linux 環境で Java 1.6 を使用しました。これ以上提案がなければ、空白テキストノードを無視する方法をいくつか作ると思います

4

5 に答える 5

11

「IgnoringElementContentWhitespace」は、すべての純粋な空白テキスト ノードを削除することではなく、親が ELEMENT コンテンツを持つとスキーマで記述されている空白ノードのみを削除することです。つまり、それらは他の要素のみを含み、テキストは含まれません。

スキーマ (DTD または XSD) を使用していない場合、要素のコンテンツはデフォルトで MIXED になるため、このパラメーターは何の効果もありません。(パーサーがすべての不明な要素を ELEMENT コンテンツを含むものとして扱う非標準の DOM 拡張機能を提供しない限り、私が知る限り、Java で利用可能なものはそうではありません。)

たとえば、< !DOCTYPE ... [...] > 宣言を含む < !DOCTYPE ... [...] > 宣言に内部サブセットを追加することで、パーサーに入る途中でドキュメントをハッキングして、スキーマ情報を含めることができます。 IgnoringElementContentWhitespace パラメーターを使用します。

または、おそらくより簡単に、後処理で、または LSParserFilter を使用して空白ノードを取り除くことができます。

于 2008-10-23T12:21:04.830 に答える
6

これは(本当に)遅い答えですが、これが私がそれを解決した方法です。NodeListクラスの独自の実装を作成しました。空のテキストノードを単に無視します。コードは次のとおりです。

private static class NdLst implements NodeList, Iterable<Node> {

    private List<Node> nodes;

    public NdLst(NodeList list) {
        nodes = new ArrayList<Node>();
        for (int i = 0; i < list.getLength(); i++) {
            if (!isWhitespaceNode(list.item(i))) {
                nodes.add(list.item(i));
            }
        }
    }

    @Override
    public Node item(int index) {
        return nodes.get(index);
    }

    @Override
    public int getLength() {
        return nodes.size();
    }

    private static boolean isWhitespaceNode(Node n) {
        if (n.getNodeType() == Node.TEXT_NODE) {
            String val = n.getNodeValue();
            return val.trim().length() == 0;
        } else {
            return false;
        }
    }

    @Override
    public Iterator<Node> iterator() {
        return nodes.iterator();
    }
}

次に、すべてのをこのクラスでラップすると、NodeListすべての空白ノードが事実上無視されます。(これは、長さが0のトリミングされたテキストを持つテキストノードとして定義します。)

また、for-eachループで使用できるという追加の利点もあります。

于 2011-05-01T22:29:12.147 に答える