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

时间:2015-03-04 13:57:38

标签: java jsoup musicxml

我需要更改一些嵌入在musicxml文件中的元素。我使用jSoup来解析文档并执行我的计算。

现在我想先了解jsoup doc并做一些修改。问题是,在xml文件中,元素没有唯一的标识符(例如,有许多注释和度量,注释没有编号)。

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

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

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

2 个答案:

答案 0 :(得分:1)

很抱歉,如果我不理解你的问题:

你是什么意思“所以修改元素对原始文档没有影响”?

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

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

我会找到带有属性at ='1'的音符,然后我会在其前后添加文本和节点,然后我会检查原始文档是否已更改,代码:

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>

正如所料。

我希望它能以任何方式提供帮助。

答案 1 :(得分:1)

我使用了更多&#34;传统&#34;方法:

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变量中的元素。