想象一下这样的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声明。知道怎么做到这一点?寻找一个简单/优雅的解决方案,最好使用JOOX,而不是20行DOM代码:)
答案 0 :(得分:2)
你可能已经想到了这一点,但万一你没有:
示例中的匹配m表示要删除的元素*,在本例中为name元素“book1”的book元素。当您在匹配时调用write()
时,只会写入该匹配的元素。因此,当您执行m.write(new File(output.xml));
时,您最终会
<book name="book1"></book>
但是remove方法从用于创建/找到匹配的Document 中删除匹配所代表的元素(即名称为“book1”的book元素)。因此,当您执行remove(nameFilter)
时,该元素实际上已从文档doc
中删除。
从文档中删除元素后,如果要将整个编辑的文档写入文件,则调用文档本身的(匹配)的write方法:
$(doc).write(new File(output.xml));
*)请注意,Match可以包含多个元素。您可以使用m.size()
来检查匹配中的元素数量。