我的coldfusion代码中有一个xml对象,如下所示:
我希望能够根据 zip 删除节点。例如 - 删除 zip 为“22222”的节点。
我知道我可以遍历每个节点,检查 zip,一旦找到它就执行<cfset ArrayDeleteAt(xmlDoc.terminals.XmlChildren, currentIndex)>
删除该节点。但是有没有更直观的方法来做到这一点?任何避免显式循环的内置冷融合功能?
我的coldfusion代码中有一个xml对象,如下所示:
我希望能够根据 zip 删除节点。例如 - 删除 zip 为“22222”的节点。
我知道我可以遍历每个节点,检查 zip,一旦找到它就执行<cfset ArrayDeleteAt(xmlDoc.terminals.XmlChildren, currentIndex)>
删除该节点。但是有没有更直观的方法来做到这一点?任何避免显式循环的内置冷融合功能?
我会为此使用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。更多信息。
选项 2:
将 jSoup jar 放在本地目录中并This.JavaSettings
在 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调用的第三个参数。