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 声明。知道如何做到这一点吗?寻找一个简单/优雅的解决方案,最好使用 JOOX,而不是 20 行 DOM 代码:)

4

1 回答 1

2

您可能已经想到了这一点,但如果您还没有:

您示例中的 Match m 表示您希望删除的元素*,在本例中为 name="book1" 的 book 元素。当您调用write()Match 时,只会写入该 Match 的元素。因此,当你这样做时,m.write(new File(output.xml));你最终得到

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

但是 remove 方法会从您用来创建/查找匹配项的文档中删除匹配项所代表的元素(即名为“book1”的书本元素) 。因此,当您这样做时remove(nameFilter),该元素实际上已从 Document 中删除doc

从 Document 中删除元素后,如果要将整个编辑后的​​Document 写入文件,则调用 Document 本身的(匹配的)write 方法:

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

*) 请注意,一个 Match 可以包含多个元素。您可以使用m.size()来检查匹配中的元素数量。

于 2015-06-30T09:22:31.100 回答