如何按属性值删除xml节点?

时间:2013-08-26 09:55:58

标签: xml coldfusion nodes

我的coldfusion代码中有一个xml对象,如下所示:

enter image description here

我希望能够根据zip删除节点。例如 - 删除压缩为“22222”的节点。

我知道我可以循环遍历每个节点,检查zip,一旦我发现它执行<cfset ArrayDeleteAt(xmlDoc.terminals.XmlChildren, currentIndex)>就删除该节点。但有没有更直观的方法来做到这一点?任何内置的coldfusion函数都可以避免显式循环?

1 个答案:

答案 0 :(得分:1)

我会使用jSoup。它实际上是一个HTML解析器,但仍然可以用于XML。

解析完XML后,按属性选择和删除就像......一样简单。

.select('[zip=22222]').remove()

...但这里有一个完整的例子,使用jSoup 1.7.2(早期版本的API可能略有不同):

<cfsavecontent variable="XmlText">
    <TERMINALS>
        <terminal location="some random location" terminal="25" zip="11111" />
        <terminal location="some other location" terminal="26" zip="22222" />
        <terminal location="some more location" terminal="22" zip="33333" />
    </TERMINALS>
</cfsavecontent>

<cfscript>
    jSoup = createObject('java','org.jsoup.Jsoup');
    Parser = createObject('java','org.jsoup.parser.Parser');

    Dom = jSoup.parse( XmlText , '' , Parser.xmlParser() );

    Dom.select('[zip=22222]').remove();

</cfscript>

<cfdump var=#Dom.outerHtml()# />


为了使代码生效,CF需要了解jSoup类,因此需要能够看到JAR文件,这可以通过四种不同的方式实现:

选项1:
将jSoup jar放在CF的lib目录中 - 例如{cf10}/cfusion/webroot/WEB-INF/lib{cf9}/webroot/WEB-INF/lib - 并重新启动CF. More info

选项2:
将jSoup jar放在本地目录中并设置This.JavaSettings in Application.cfc - 此功能已添加到CF 10和Railo 4.0中

选项3:
将jSoup jar放在本地目录中并使用JavaLoader加载它(类似于上面的内容,但适用于任何版本)。

然后应将上面的两个createObject行替换为:

jl = new javaloader.JavaLoader([expandPath('./jsoup-1.7.2.jar')]);
jSoup  = jl.create('org.jsoup.Jsoup');
Parser = jl.create('org.jsoup.parser.Parser');

(假设jar文件与脚本位于同一目录中)

选项4:
对于Railo和OpenBD,上述选项可以使用,或者您可以简单地引用JAR文件的路径作为createObject调用的第三个参数。