0

次のような XML ドキュメントを想像してください。

<?xml version="1.0" encoding="UTF-8" ?>
<books>
  <book name="book1"></book>
  <book name="book2"></book>
</books>

いくつかの書籍を除外した後、ドキュメントを新しいファイルに書き込みたいと考えています。私はJOOXを使用しており、次のようなコードがあります。

final FastFilter nameFilter = new FastFilter() {
    final Set<String> validNames = new HashSet<>();//contains "book1"
    @Override public boolean filter(Context context) {
        return !validNames.contains($(context).attr("name"));
    }
};      
final Document doc = $(new StringReader("entire text of xml document...")).document();
final Match m = $(doc).find("book").remove(nameFilter);

私はこのようなことを試しましm.write(new File(output.xml));たが、それは次のようなものしか出力しません:

<book name="book1"></book>

つまり、親要素<books>と最初の XML 宣言が欠落しています。これを達成する方法はありますか?20行のDOMコードではなく、できればJOOXを使用したシンプルでエレガントなソリューションを探しています:)

4

1 に答える 1

2

おそらくすでにこれを理解していると思いますが、そうでない場合に備えて:

例の Match m は、削除する要素*を表します。この場合、name="book1" の book 要素です。Matchを呼び出すwrite()と、書き込まれるのはその Match の要素のみです。したがって、あなたがそうするとき、あなたはm.write(new File(output.xml));で終わる

<book name="book1"></book> 

ただし、remove メソッドは、一致の作成/検索に使用した Document から、一致によって表される要素 (つまり、"book1" という名前の book 要素) を削除します。そのためremove(nameFilter)、その要素は Document から実際に削除されdocます。

Document から要素が削除された後、編集済みの Document 全体をファイルに書き込む場合は、Document 自体の (Match の) write メソッドを呼び出します。

$(doc).write(new File(output.xml)); 

*) Match には複数の要素を含めることができることに注意してください。m.size()Match の要素数を確認するために使用できます。

于 2015-06-30T09:22:31.100 に答える