2

Java SEでXMLノードを削除するには? を使用してorg.apache.xercesいます。ありがとう。以下のコードは機能しません。

DOMParser parser = new DOMParser();
System.out.println(DIR_STRING + "/" + jmsFileNameString);
parser.parse(DIR_STRING + "/" + jmsFileNameString);
Document doc = parser.getDocument();
NodeList list = doc.getElementsByTagName("*");
for (int i = 0; i < list.getLength(); i++) {
    if (list.item(i).getNodeName().matches(HEADER_REGEXP)) {
        list.item(i).getParentNode().removeChild(list.item(i)));
    }
}
4

3 に答える 3

3

このために DOM 全体を作成するのはかなりやり過ぎです。XML ツリー全体がメモリ内にあるため、大きなドキュメントの場合はかなり重くなる可能性があります。次のいずれかをお勧めします。

  • SAXまたはStAXで解析し、フィルターで除外したくない場合は、単に出力にコピーします。
  • デフォルトですべてをコピーする XSLT 変換を適用しますが、入力に対して何もしないテンプレートが 1 つ以上あるため、それを除外します。

オプション 2 が最も簡単で、私の経験では、Java の XSLT は高速でメモリ効率が高く、特にこのような単純なユース ケースでは有効です。

これらの 2 つのテンプレートが必要になります。

デフォルトのコピー

<xsl:template match="node()|@*">
    <xsl:copy><xsl:apply-templates select="node()|@*"/><xsl:copy>
</xsl:template>

「フィルター」:

<xsl:template match="//*[your predicate here]">
    <!-- Don't do a thing -->
</xsl:template>

編集:特定の名前だけでなく、正規表現に一致する名前を除外していることに気付きました。ターゲット ノードを選択する述語を作成するには、XPath 関数で十分な場合があります。ただし、必要に応じて、拡張機能を使用して Java String 関数を XSLT で使用できます。これにより、このソリューションは少し複雑になりますが、XML 構文解析を手放すという意味では、それでも価値があります。

于 2011-08-25T12:14:57.103 に答える
0

それは機能します。ただし、XML ファイルには保存されません。変更は Document オブジェクトに保存されます。

ファイル内の Document オブジェクトに保存するには:

    OutputFormat of = new OutputFormat("XML","UTF-8",true);
    XMLSerializer serializer = new XMLSerializer();
    serializer.setOutputFormat(of);
    serializer.setOutputByteStream(new FileOutputStream(PATH));
    serializer.serialize(doc);
于 2011-08-25T12:13:44.547 に答える
-1

ざっと見ただけでは理由がわかりません。詳細情報を提供するために、Eclipse でデバッガーを使用してみてください。メソッドにデバッグ ポイントを設定し、各行を調べます。

debug 式を使用してループを検査し、問題を絞り込むために必要な状態がすべてあることを確認します。

于 2011-08-25T12:14:33.503 に答える