2

remove xmlを使用してノードに接続しようとしてgroovyいます。ここrequiredByDateでは、複数回存在し、プレフィックス付きの名前空間を持つ要素を削除します。

ネットで入手可能な多くの例とスタックオーバーも調べました。それらのいくつかは近いです。その 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要素は削除されません (xml に 3 回存在します)。

名前空間、つまり をハードコーディングすると'ord1:requiredByDate'、目的の出力が得られます。ここを参照xml.'**'.findAll{ it.name() == 'ord1:requiredByDate' }

ただし、実行時にxmlに含まれるプレフィックスはわかりません。したがって、findAll上記のハードコーディングされたプレフィックスは使用できません。

4

1 に答える 1

1

名前空間を持つノードは、メソッドQNameに対して を返します。name()メソッドを使用して、名前空間なしでノードの「ローカル」名にアクセスできますQName.getLocalPart()

これを試して:

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

QNameを参照

またはNodeの javadoc :

通常、名前は文字列で、値は文字列または他のノードのリストのいずれかですが、タイプは柔軟な構造を提供するために拡張可能です。たとえば、名前空間 URI とローカル名を含む名前として QName を使用できます

于 2016-03-06T11:47:34.300 に答える