读取soap响应中的xml时命名空间错误(不为空)

xv8emn3q  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(375)

我对soap服务有一个问题,它返回直接嵌入soapxml中的xml文档。soap响应如下所示:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header />
    <soap:Body xmlns="WebserviceNamespace">
        <Result xmlns="WebserviceNamespace">
            <ActualXmlDocument DtdRelease="0" DtdVersion="4" xmlns="">
                ...
            </ActualXmlDocument>
        </Result>
    </soap:Body>
</soap:Envelope>

的内容类型 <Result> 根据wsdl是

<s:element minOccurs="0" maxOccurs="1" name="Result">
    <s:complexType mixed="true">
        <s:sequence>
            <s:any />
        </s:sequence>
    </s:complexType>
</s:element>

对于 <ActualXmlDocument> 我已经用 xjc 从提供的xsd文件。对于我正在使用的webservice实现 javax.jws/javax.jws-api/1.1 , javax.xml.ws/jaxws-api/2.3.1 以及 com.sun.xml.ws/rt/2.3.1 . 表示对象的对象的类型 <ActualXmlDocument> 我从ws实现中检索到 com.sun.org.apache.xerces.internal.dom.ElementNSImpl 哪个实现了 org.w3c.dom.Node . 当试图用jaxb解组时

JAXBContext context = JAXBContext.newInstance(ActualXmlDocument.class);
context.createUnmarshaller().unmarshal((Node)result);

我得到以下例外

UnmarshalException:
    unexpected element (URI:"WebserviceNamespace", local:"ActualXmlDocument").
    Expected elements are <{}ActualXmlDocument>

因此,由于某些原因,在读取xml文档时,空名称空间不会被视为新的默认名称空间,而是被放错位置的webserivenamespace覆盖。
那么我该如何解决这个问题呢?我不想仅仅为了适应这种明显错误的行为而触碰xsd生成的文件。此外,我不能控制webservice的服务器端,因此无法更改其行为。我现在看到的唯一可能性是jaxb:如何在解组xml文档时忽略名称空间?
是否有其他方法可以获得具有正确命名空间的节点?

r6hnlfcb

r6hnlfcb1#

受jaxb启发:如何在解组xml文档时忽略名称空间?我实现了一个解决方案,这不是最好的方法,因为它需要将dom序列化为xml文档:

JAXBContext context = JAXBContext.newInstance(ActualXmlDocument.class);
Unmarshaller unmarshaller = context.createUnmarshaller();

SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
saxParserFactory.setNamespaceAware(false);
XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();

Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
OutputStreamout = new ByteArrayOutputStream();
StreamResult streamResult = new StreamResult(out);
transformer.transform(new DOMSource(result), streamResult);

InputStream in = new ByteArrayInputStream(out.toByteArray())
SAXSource source = new SAXSource(xmlReader, new InputSource(in));

unmarshaller.unmarshal(source);

相关问题