使用JOOX过滤XML元素,然后写入完整文档

时间:2015-05-08 19:47:23

标签: java xml dom xml-parsing joox

想象一下这样的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代码:)

1 个答案:

答案 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()来检查匹配中的元素数量。