3

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

在此处输入图像描述

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

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

4

1 回答 1

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。更多信息

选项 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调用的第三个参数。

于 2013-08-26T11:32:16.427 回答