我的coldfusion代码中有一个xml对象,如下所示:
我希望能够根据zip删除节点。例如 - 删除压缩为“22222”的节点。
我知道我可以循环遍历每个节点,检查zip,一旦我发现它执行<cfset ArrayDeleteAt(xmlDoc.terminals.XmlChildren, currentIndex)>
就删除该节点。但有没有更直观的方法来做到这一点?任何内置的coldfusion函数都可以避免显式循环?
答案 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调用的第三个参数。