当前位置: 首页 > 知识库问答 >
问题:

在 Soap 响应中读取 XML 时出现错误的命名空间(不为空)

闾丘书
2023-03-14

我有一个SOAP服务的问题,它返回直接嵌入在SOAP XML中的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>

的内容类型

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

对于

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

我得到以下异常:

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

因此,由于某些原因,在读取XML文档时,空名称空间不会被视为新的默认名称空间,而是被放错位置的WebserivNamespace覆盖。

那么我如何解决这个问题呢?我不想仅仅为了适应这种明显错误的行为而接触XSD生成的文件。此外,我无法控制Web服务的服务器端,因此无法更改其行为。我现在看到的唯一可能性是JAXB:如何在解组XML文档时忽略名称空间?

是否有其他方法可以获得具有正确命名空间的节点?

编辑:这其实是com . sun . XML . WS . API . message . SAAJ . saajstaxwriter中的一个bug,在JDK 1.8.0u172中解决了,可惜在JAX WS本身没有解决。


共有1个答案

姜嘉赐
2023-03-14

受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);
 类似资料:
  • 问题内容: 在花了几个令人沮丧的时间后,我正在寻求您的帮助。 我正在尝试从SOAP响应中获取特定节点的内容。 响应是 我试图了解 的节点和子节点。由于XML包含名称空间 不起作用。我已经阅读了许多文章,例如 http://www.sitepoint.com/blogs/2005/10/20/simplexml-and-namespaces/ http://blog.stuartherbert.co

  • 我正在使用 JAXB 来对我正在实现 Java 客户端的 Web 服务进行封送和解组和取消马歇尔请求和响应。然而,我被困在以下回应上,我需要解体。 为了将响应表示为Java对象,我有以下域类: 然后,我执行以下操作来解除元帅: 解编组没有发生任何事件。 对象是使用两个列表创建的。为空,有一项。但是,该项目上的和 null。我认为这与XML命名空间有关,但我无法弄清楚如何修复它。 我尝试了另一种方式

  • 我们正在创建一个可以支持XML和JSON格式的Spring boot REST服务。我们使用这里描述的相同方法:接受/返回XML/JSON请求和响应- Spring MVC 除了我们需要在XML响应中有一个名称空间之外,它大部分都是有效的,目前响应XML没有任何名称空间。我们尝试在DTO类中添加以下内容,并尝试创建“package info.java”。两者都不起作用。有人有什么建议吗? @jav

  • null 注意:我们在使用SOAP-UI时获得了正确的请求信息。只有jars或liberty有一些问题。我们甚至向自由队提出了要求。如果有人可能已经在Liberty Server上面临过类似的问题,我会把这个问题放在这个社区中来获得想法。

  • 我试图使用jaxb解组一个soap响应。 我尝试使用以下代码查找根元素 这是我的样本回复 我能够获取对象,但当我尝试访问中的时,由于前缀 有人能帮我脱身吗? 更新:有人能帮我吗? 我使用stax xml解析器解析为,但我将其中的所有值都视为null。

  • 我试图将整个文件作为字符串对象加载到内存中。但是在应用程序结束后,我的内存不会被释放回垃圾收集器。我知道在内存中读取整个文件是不好的,但是我必须将数据发送到另一个类,有人能帮助我如何做这只是一个流,而不是将整个代码加载到内存中,如果没有,有人能说我现在的代码有什么问题吗