2013-10-11 6 views
1

У меня есть этот WSDLXPATH для извлечения элемента

<definitions targetNamespace="http://testwork/" name="HelloWorldService" 
      xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
      xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" 
      xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" 
      xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
      xmlns:tns="http://testwork/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <types> 
     <xsd:schema> 
      <xsd:import namespace="http://soapServlet/" schemaLocation="http://localhost:8085/testwork/soapServlet?xsd=1"/> 
     </xsd:schema> 
    </types> 
    <message name="sayHelloWorldFrom"> 
     <part name="parameters" element="tns:sayHelloWorldFrom"/> 
    </message> 
    <message name="sayHelloWorldFromResponse"> 
     <part name="parameters" element="tns:sayHelloWorldFromResponse"/> 
    </message> 
    <message name="additionalFault"> 
     <wsdl:part name="error" element="tns:responseFault"/> 
    </message> 
    <portType name="HelloWorld"> 
     <operation name="sayHelloWorldFrom"> 
      <input wsam:Action="http://testwork/HelloWorld/sayHelloWorldFromRequest" message="tns:sayHelloWorldFrom"/> 
      <output wsam:Action="http://testwork/HelloWorld/sayHelloWorldFromResponse" message="tns:sayHelloWorldFromResponse"/> 
      <wsdl:fault name="error" message="additionalFault"/> 
     </operation> 
    </portType> 
    <binding name="HelloWorldPortBinding" type="tns:HelloWorld"> 
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> 
     <operation name="sayHelloWorldFrom"> 
      <soap:operation soapAction=""/> 
      <input> 
       <soap:body use="literal"/> 
      </input> 
      <output> 
       <soap:body use="literal"/> 
      </output> 
      <fault name="error"> 
       <soap:fault name="error" use="literal"/> 
      </fault> 
     </operation> 
    </binding> 
    <service name="HelloWorldService"> 
     <port name="HelloWorldPort" binding="tns:HelloWorldPortBinding"> 
      <soap:address location="http://localhost:8085/testwork/soapServlet"/> 
     </port> 
    </service> 
</definitions> 

Я хочу, чтобы проверить, если этот элемент «sayHelloWorldFrom» действительно существует в этой схеме. Я использую XPath для поиска, это мой фрагмент кода

InputStream isr = IOUtils.toInputStream(wsdl); 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     factory.setNamespaceAware(false); 
     try { 
      org.w3c.dom.Document doc = factory.newDocumentBuilder().parse(isr); 
      XPathFactory xFactory = XPathFactory.newInstance(); 
      XPath xPath = xFactory.newXPath(); 
      org.w3c.dom.Element element = (org.w3c.dom.Element) xPath.compile(
         "definitions/portType/operation[@name='" + funcName + 
         "']").evaluate(doc, XPathConstants.NODE); 
      log.info("element " + element); 
      if (element == null) { 
       throw new ServiceException(ErrorCode.SOAP_EXCEPTION_005); 
      } 

Но элемент == NULL для какой-то причины, но я видел, с помощью отладки, что имя_функции действительно sayHelloWorldFrom. Итак, в чем проблема?

ответ

0

Я не знаю, почему, но когда я снял эту часть:

xmlns="http://schemas.xmlsoap.org/wsdl/" 

работал XPath (возможно потому, что XMLNS означает что-то для XML или XPath)

definitions/portType/operation[@name='sayHelloWorldFrom'] 

вы можете проверить его здесь http://www.xpathtester.com/obj/2403e210-fac4-4dd2-be63-69fcba8e0ac1

+0

Спасибо, но если я удалю эту строку, мой wsdl станет недействительным, так что я могу сделать, чтобы сделать эту работу XPath без удаления этой строки? – user2390742

+0

Возможно, вы можете перейти на xmlns: wsdl (просто угадайте, как я не очень хорош) – Darka

+0

, как я нашел здесь http://www.w3schools.com/xml/xml_namespaces.asp, вы можете изменить его на какое-то имя. – Darka

Смежные вопросы