Удалите определенный узел XML с пространством имен, используя groovy

Пытаясь remove xml узлы, использующие groovy, Здесь хочу удалить requiredByDate элемент, который присутствует несколько раз и имеет namcespace с префиксом.

Посмотрел много примеров, доступных в сети, а также наложений. Некоторые из них близки. Если для этого элемента xml нет пространства имен, получим желаемый результат.


Проблема заключается в том, что элемент xml имеет пространство имен и не может достичь желаемого результата.

Вот отличный сценарий, который я пробую:

import groovy.xml.*
def x='''<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://www.example/test/commontypes" xmlns:ord="http://www.example/test/orderservice" xmlns:ord1="http://www.example/test/order">
   <soapenv:Header/>
   <soapenv:Body>
         <ord:orderRequest>
            <ord1:orderRef>${#TestCase#ORDERREF}</ord1:orderRef>
            <ord1:header>
               <ord1:description>user test</ord1:description>
               <ord1:customerID></ord1:customerID>
               <ord1:requiredByDate>2010-02-02T12:00:00-07:00</ord1:requiredByDate>               
            </ord1:header>
            <ord1:line>
               <ord1:lineNumber>1</ord1:lineNumber>
               <ord1:actionMode>mode1</ord1:actionMode>
               <ord1:requiredByDate>2010-02-02T12:00:00-07:00</ord1:requiredByDate>
            </ord1:line>
            <ord1:line>
               <ord1:lineNumber>2</ord1:lineNumber>
               <ord1:action>userAction</ord1:action>
               <ord1:requiredByDate>2010-02-02T12:00:00-07:00</ord1:requiredByDate>
            </ord1:line>
         </ord:orderRequest>
   </soapenv:Body>
</soapenv:Envelope>'''
def xml=new XmlParser().parseText(x)
def nodes = xml.'**'.findAll{ it.name() == 'requiredByDate' }
nodes.each{it.parent().remove(it)}
XmlUtil.serialize(xml).toString()

Выходной сигнал совпадает с входным, т. Е. Не удаляет requiredByDate элементы (представлены 3 раза в XML)

Если я жесткий код с пространством имен, т.е. 'ord1:requiredByDate', то желаемый результат приходит. ссылаясь xml.'**'.findAll{ it.name() == 'ord1:requiredByDate' } Вот.

Тем не менее, я не знаю, какой префикс входит в XML во время выполнения. Следовательно, нельзя использовать жестко заданный префикс в findAll выше.

1 ответ

Решение

Узел с пространством имен возвращает QName за его name() метод. Вы можете получить доступ к "локальному" имени узла, без пространства имен, с помощью метода QName.getLocalPart()

Попробуй это:

def nodes = xml.'**'.findAll{ it.name().localPart == 'requiredByDate' }

Смотрите QName

Или Javadoc для узла:

Обычно именем является строка, а значением является строка или список других узлов, хотя типы могут расширяться для обеспечения гибкой структуры, например, вы можете использовать QName в качестве имени, которое включает URI пространства имен и локальное имя.

Другие вопросы по тегам