迭代不同的元素并更改 JSoup 中的特定元素

Iterating over different elements and changing a particular one in JSoup

我需要更改一些嵌套在音乐xml 文件深处的元素。我使用 jSoup 来解析文档并执行我的计算。

现在我想先对jsoup文档进行一些修改。问题是,在 xml 文件中,元素没有唯一标识符(例如,有很多音符和小节,音符没有编号)。

我像这样遍历文档。在满足某些条件后,我想更改特定的注释。在 java 中使用此 iter 使用副本,因此修改元素不会对原始文​​档产生影响。我可以使用 for i = 0;我<??或者其他的东西?这会以相同的顺序遍历元素吗(对于检查标准很重要)。

for (Element thismeasure : thisPart.getElementsByTag("measure")) {

                for (Element thisnote : thismeasure.children()) {

抱歉,如果我没有很好地理解你的问题:

"so modifying the elements doesn't make a difference on the original doc" 是什么意思?

使用简单的 xml 我可以使用您的循环进行一些更改,测试 xml 将是:

<measure><note/><note at='1'/></measure>

我会找到属性为at='1'的note,然后我会在里面添加文字和前后节点,然后我会检查原始文档是否被更改,代码:

public static void main(String[] args) {
    String xml = "<measure><note/><note at='1'/></measure>";
    Document parse = Jsoup.parse(xml, "", Parser.xmlParser());


    for (Element thismeasure : parse.getElementsByTag("measure")) {

        for (Element thisnote : thismeasure.children()) {
            if (thisnote.attr("at").equals("1")){
                thisnote.text("newText");
                thisnote.attr("newAttr", "value");
                thisnote.before(new Element(Tag.valueOf("test1"),""));
                thisnote.after(new Element(Tag.valueOf("test2"),""));
            }
        }
    }

    System.out.println(parse);
}

将输出:

<measure>
<note />
<test1></test1>
<note at="1" newattr="value">
 newText
</note>
<test2></test2>
</measure>

符合预期。

希望对您有所帮助。

我用了一个更"traditional"的方法:

for (int z = 0; z < this.doc.select("part").size(); z++ ){
            for (int y = 0; y <  this.doc.select("part").get(z).getElementsByTag("measure").size(); y++){
...

这使我可以使用 set 方法更改实际 doc 变量中的元素。