2013-08-26 5 views
3

У меня есть объект XML в моем ColdFusion код, который выглядит следующим образом:Как удалить узел xml по значению атрибута?

enter image description here

Я хотел бы иметь возможность удалить узел, основанный на молнии. Например - удалите узел с зазором «22222».

Я знаю, что я могу пройти через каждый узел, проверить zip, и как только я нахожу, что он выполняет <cfset ArrayDeleteAt(xmlDoc.terminals.XmlChildren, currentIndex)>, чтобы удалить этот узел. Но есть ли более интуитивный способ сделать это? Любые встроенные функции coldfusion, которые избегают явного цикла?

ответ

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's lib - например. {cf10}/cfusion/webroot/WEB-INF/lib или {cf9}/webroot/WEB-INF/lib - и перезапустить CF. More info.

Вариант 2:
Поместите банку jSoup в локальном каталоге и установки This.JavaSettings in Application.cfc - эта функция была добавлена ​​в CF 10 и Railo 4.0

Вариант 3:
Поместите jSoup банку в локальный каталог и используйте 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'); 

(предполагается, что файл фляги находится в той же директории, что и скрипт)

Вариант 4:
Для Railo и OpenBD, то выше будут работать, или вы можете просто ссылаться на путь к JAR-файлу в качестве третьего аргумента для вызовов createObject.

+0

Ох, не знал, что Railo сделал это! Спасибо за тангенциальный наконечник. –

+0

Когда я пытаюсь выполнить второй вариант загрузки файла jar, я получаю сообщение об ошибке «Каталог или файл ./lib/, указанный в LOADPATHS, не существует» ... – froadie

+0

Я предполагаю, что каталог существует? Попробуйте expandPath? Может потребоваться перезапуск CF тоже. –

Смежные вопросы