Когда я создаю 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
ли это известная ошибка или я что-то отсутствует?
Если вы попросите синтаксический анализатор не поддерживать пространство имен XML, не следует, чтобы логика внутри findAll была '(node.name() ==" xt: replace ")', которая указала имя узла как это. – dmahapatro
Да, когда я ищу «xt: replace», узел найден. У меня было другое понимание того, что означает «namespaceAware». Я предположил, что это означает игнорирование пространств имен. Насколько я знаю, имя элемента не может содержать двоеточие, так как двоеточие зарезервировано для назначения пространства имен. Но здесь префикс «xt:» рассматривается как часть имени. Поведение XmlSlurper кажется мне запутанным. Также, когда префикс пространства имен изменяется, что является общим, программа перестает работать. – KarelHusa
Итак, почему бы не использовать 'def envelope1 = new XmlSlurper (false, true) .parseText (xml)', поэтому проверка отключена, но это пространство имен известно ... –