3

私のcoldfusionコードには、次のようなxmlオブジェクトがあります。

ここに画像の説明を入力

zip に基づいてノードを削除できるようにしたいと考えています。たとえば、「22222」の zip を持つノードを削除します。

各ノードをループして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 ファイルを参照できる必要があります。これは、次の 4 つの異なる方法で実現できます。

オプション 1:
jSoup jar を CF の lib ディレクトリ (例:{cf10}/cfusion/webroot/WEB-INF/libまたは) に配置し、CF{cf9}/webroot/WEB-INF/libを再起動します。詳細情報.

オプション 2:
jSoup jar をローカル ディレクトリに配置しThis.JavaSettings、Application.cfc でセットアップします。この機能は、CF 10 および Railo 4.0 で追加されました。

オプション 3:
jSoup jar をローカル ディレクトリに配置し、JavaLoader を使用てロードします (上記と同様ですが、どのバージョンでも機能します)。

次に、上記の 2 つの 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 の場合、上記のオプションが機能します。または、 createObject呼び出し
の 3 番目の引数として JAR ファイルへのパスを参照するだけでもかまいません。

于 2013-08-26T11:32:16.427 に答える