Как перебрать xml-узлы с Groovy? - PullRequest
0 голосов
/ 22 сентября 2009

Начал работать с SoapUI и не может понять, как обрабатывать ответы Soap с помощью Groovy. В настоящее время мой проект открыт в NetBeans и после отладки будет скопирован в SoapUI (eviware). Мой вопрос:

def Input = """ <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body>
      <ns2:getSalesAuditsResponse xmlns:ns2="http://apidto.dto.t2.wsapi.ng.com/">
         <return>
            <code>0909019000004830</code>
            <realOpenAmount>12</realOpenAmount>
            <dueDate>2009-07-11T00:00:00+03:00</dueDate>
         </return>
         <return>
            <code>0909119000006260</code>
            <realOpenAmount>55.75</realOpenAmount>
            <dueDate>2007-02-11T00:00:00+02:00</dueDate>
         </return>
      </ns2:getSalesAuditsResponse>    </S:Body> </S:Envelope>
    """

Как найти «возвратный» узел с определенным значением dueDate? Как я могу предположить, это может быть рядом:

def document = new groovy.util.XmlSlurper().parseText(Input);
def sa = document.depthFirst().findAll { it.@dueDate=="2007-02-01T00:00:00+02:00" }

Но в этом случае sa []. А ведь как удалить найденный узел в оригинальном XML?

Я пробовал использовать XMLHolder, но не знал, как инициализировать его в переменной контекста Netbeans, существующей в SoapUI.

def groovyUtils = новый com.eviware.soapui.support.GroovyUtils (??? context ???) def dataHolder = groovyUtils.getXmlHolder (вход) def data = dataHolder.getDomNode ("// return [dueDate =" 2007-02-11T00: 00: 00 + 02: 00 "]")

И последний более общий вопрос: Можно ли отлаживать скрипты Groovy в NetBeans и использовать их позже в SoapUI 3.0.1? Или невозможно получить код автозаполнения и док по требованию для groovy_for_SoapUI?

Большое спасибо

1 Ответ

0 голосов
/ 22 сентября 2009

it. @ DueDate ссылается на атрибут dueDate, а не на узел. Во-вторых, вы ищете «2007-02-01 ...» в своем коде, который должен был быть «2007-02-11 ...», чтобы соответствовать фактическому узлу во входном XML, я бы предположил.

Итак, это работает:

def Input = """ <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
      <S:Body>
        <ns2:getSalesAuditsResponse xmlns:ns2="http://apidto.dto.t2.wsapi.ng.com/">
           <return>
              <code>0909019000004830</code>
              <realOpenAmount>12</realOpenAmount>
              <dueDate>2009-07-11T00:00:00+03:00</dueDate>
           </return>
           <return>
              <code>0909119000006260</code>
              <realOpenAmount>55.75</realOpenAmount>
              <dueDate>2007-02-11T00:00:00+02:00</dueDate>
           </return>
       </ns2:getSalesAuditsResponse>
     </S:Body>
    </S:Envelope>
    """
def document = new groovy.util.XmlSlurper().parseText(Input);
def sa = document.depthFirst().findAll {it.dueDate == "2007-02-11T00:00:00+02:00"}

Если бы я намеревался изменить XML, я думаю, что в итоге я бы использовал стандартный MarkupBuilder или StreamingMarkupBuilder для вывода нового XML в нужной мне форме.

...