2017-02-02 4 views
0

Когда я создаю XMLSlurper без проверки и пространства имен сознания:.XMLSlurper: узлы не найдены при использовании XmlSlurper (ложь, ложь)

new XmlSlurper(false, false) 

я впоследствии не может найти какие-либо узлы с node.depthFirst() FindAll().

Следующий код иллюстрирует мой вопрос:

def xml = '''<?xml version="1.0" encoding="UTF-8"?> 
<cus:Customizations xmlns:cus="http://www.bea.com/wli/config/customizations" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xt="http://www.bea.com/wli/config/xmltypes"> 
    <cus:customization xsi:type="cus:EnvValueActionsCustomizationType"> 
     <cus:description/> 
     <cus:actions> 
      <xt:replace> 
       <xt:envValueType>Service URI</xt:envValueType> 
       <xt:location>0</xt:location> 
       <xt:value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema">http://myUrl.com</xt:value> 
      </xt:replace> 
     </cus:actions> 
    </cus:customization> 
</cus:Customizations>''' 

/* The following code finds no nodes. */ 
def envelope1 = new XmlSlurper(false, false).parseText(xml) 
def replaces1 = envelope1.depthFirst().findAll { node -> 
    (node.name() == "replace") 
} 
assert replaces1.size() == 0 

/* The following code finds one node (works as I expect). */ 
def envelope2 = new XmlSlurper().parseText(xml) 
def replaces2 = envelope2.depthFirst().findAll { node -> 
    (node.name() == "replace") 
} 
assert replaces2.size() == 1 

ли это известная ошибка или я что-то отсутствует?

+1

Если вы попросите синтаксический анализатор не поддерживать пространство имен XML, не следует, чтобы логика внутри findAll была '(node.name() ==" xt: replace ")', которая указала имя узла как это. – dmahapatro

+0

Да, когда я ищу «xt: replace», узел найден. У меня было другое понимание того, что означает «namespaceAware». Я предположил, что это означает игнорирование пространств имен. Насколько я знаю, имя элемента не может содержать двоеточие, так как двоеточие зарезервировано для назначения пространства имен. Но здесь префикс «xt:» рассматривается как часть имени. Поведение XmlSlurper кажется мне запутанным. Также, когда префикс пространства имен изменяется, что является общим, программа перестает работать. – KarelHusa

+1

Итак, почему бы не использовать 'def envelope1 = new XmlSlurper (false, true) .parseText (xml)', поэтому проверка отключена, но это пространство имен известно ... –

ответ

0

Когда свойство XmlSlurper в namespaceAware устанавливается в ложь, мы должны относиться префикс пространства имен в качестве части имени элемента, то есть, когда мы ищем элемент:

(node.name() == "xt:replace") 

Такое поведение XmlSlurper делает не кажется мне правильным, но так оно и работает. Двойной двоеточие (:) не может быть частью имени элемента XML и зарезервировано для использования пространства имен. Мой вывод состоит в том, что я буду использовать namespaceAware, установленный в true в будущем.

Спасибо @dhamapatro за вашу помощь.