получение сервиса от wsdd через xpath не прерывается (xmltask) - PullRequest
2 голосов
/ 07 июня 2010

Я пытаюсь получить XPath "/ deploy / service". Протестировано на этом сайте: http://www.xmlme.com/XpathTool.aspx

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org  /axis/wsdd/providers/java">

 <service name="kontowebservice" provider="java:RPC" style="rpc" use="literal">
  <parameter name="wsdlTargetNamespace" value="http://strategies.spine"/>
  <parameter name="wsdlServiceElement" value="ExposerService"/>
  <parameter name="wsdlServicePort" value="kontowebservice"/>
  <parameter name="className" value="some.package.internal.KontoWebServiceImpl_WS"/>
  <parameter name="wsdlPortType" value="Exposer"/>
  <parameter name="typeMappingVersion" value="1.2"/>
  <operation xmlns:operNS="http://strategies.spine" xmlns:rtns="http://www.w3.org/2001/XMLSchema" name="expose" qname="operNS:expose" returnQName="exposeReturn" returnType="rtns:anyType" soapAction="">
    <parameter xmlns:tns="http://www.w3.org/2001/XMLSchema" qname="in0" type="tns:anyType"/>
  </operation>
  <parameter name="allowedMethods" value="expose"/>
  <parameter name="scope" value="Request"/>

</service>
</deployment>

Я абсолютно не могу понять, почему он всегда говорит мне, что мой xpath не совпадает ... Это может быть глупо, но я что-то упустил?

EDIT

Благодаря ответу Дмитрия Новатчева мне удалось найти обходной путь:

<xmltask failwithoutmatch="true" report="false">
    <fileset dir="${src.gen}/" includes="**/*-deploy.wsdd" />
    <copy path="//*[local-name()='service']" buffer="tmpServiceBuf" append="true" />
</xmltask>
<xmltask failwithoutmatch="true" report="false" source="${basedir}/env/axis/WEB-INF/server-config.wsdd" dest="${build.stage}/resources/WEB-INF/server-config.wsdd">
    <insert path="//*[local-name()='transport'][last()]" buffer="tmpServiceBuf" position="after" />
</xmltask>

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

1 Ответ

2 голосов
/ 08 июня 2010

Проблема : этот документ XML имеет пространство имен по умолчанию. XPath считает любые имена без префиксов находящимися в «пространстве без имен». Он пытается выбрать /deployment/service, где элементы deployment и service находятся в пространстве без имен, и не выбирает ни одного узла, потому что в предоставленных документах XML нет таких элементов, которые находятся в "пространстве без имен (они все находятся в пространстве имен "http://xml.apache.org/axis/wsdd/")

Решение : Использование языка, на котором размещается XPath (например, C #, Jave, XSLT или любой другой язык, который вы можете использовать), привязывает префикс (скажем x:) к пространству имен "http://xml.apache.org/axis/wsdd/".

Затем измените:

/deployment/service

до

/x:deployment/x:service

Теперь последнее выражение XPath правильно выбирает нужный узел.

...