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

如何将 SOAP XML 解组为 Java 对象 [重复]

刘瀚
2023-03-14

当试图将我的soap XML解组到JAXB对象时,我得到了下面的错误。

我们得到的错误是预期元素为无。在解组SOAP XML时应该做任何特定的事情。

javax.xml.bind.JAXBContext jaxbContext = (javax.xml.bind.JAXBContext) JAXBContext.newInstance(Class.forName(requestName));
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(SoapXmlString);          
reqInfo = unmarshaller.unmarshal(reader);

我收到以下错误:

 javax.xml.bind.UnmarshalException: unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Envelope"). Expected elements are (none)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:642)
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:254)
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:249)
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:116)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement

下面是示例 XML

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v2="http://example.com/v2">
       <soapenv:Header/>
       <soapenv:Body>
          <v2:createSession>
             <v2:client>
                <!--Optional:-->
                <v2:name>?</v2:name>
                <!--Optional:-->
                <v2:clientId>?</v2:clientId>
                <!--Optional:-->
                <v2:requestId>?</v2:requestId>
             </v2:client>
             <!--Optional:-->
             <v2:oldSessionId>?</v2:oldSessionId>
             <!--Optional:-->
             <v2:clientIp>?</v2:clientIp>
             <!--Optional:-->
             <v2:clientIpStatus>?</v2:clientIpStatus>
             <!--Optional:-->
             <v2:superBYOBFlow>?</v2:superBYOBFlow>
             <!--Optional:-->
             <v2:FlowParams>?</v2:FlowParams>
             <!--Optional:-->
             <v2:deviceInfo>?</v2:deviceInfo>
          </v2:createSession>
       </soapenv:Body>
    </soapenv:Envelope>

请帮忙。

共有1个答案

尉迟彬
2023-03-14

我不认为你正在考虑SOAP信封...您生成的 JAXB Unmarshaller 不会知道有关 Body 或 Envelope 标签的任何信息,它将期望您的 createSession 是根元素,因此会出现“意外元素”错误。

您需要首先从信封中提取内容,您可以使用message.getSOAPBody()来完成。extractContentAsDocument(),如果您首先从内容创建SOAPMessage对象。

这是相当繁琐的工作,这是我博客中的一个工作示例

String example =
        "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Header /><soapenv:Body><ns2:farm xmlns:ns2=\"http://adamish.com/example/farm\"><horse height=\"123\" name=\"glue factory\"/></ns2:farm></soapenv:Body></soapenv:Envelope>";
SOAPMessage message = MessageFactory.newInstance().createMessage(null,
        new ByteArrayInputStream(example.getBytes()));
Unmarshaller unmarshaller = JAXBContext.newInstance(Farm.class).createUnmarshaller();
Farm farm = (Farm)unmarshaller.unmarshal(message.getSOAPBody().extractContentAsDocument());

似乎如果您没有在模式. xsd文件中声明您的命名空间,那么您将看到您遇到的错误。

我用根元素createSession创建了一个虚拟模式,通过添加targetNamespace属性并重新生成JAXB类,错误消失了

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema
     xmlns:xs="http://www.w3.org/2001/XMLSchema"
     targetNamespace="http://example.com/v2"> <!-- targetNamespace essential for JAXB to work-->
    <xs:element name="createSession">  
        <xs:complexType>
            <xs:attribute name="foo" type="xs:string" use="required" />
        </xs:complexType>
    </xs:element>
</xs:schema>
 类似资料:
  • 我有一个作业要创建一个应用程序,当通过微调器选择学生的名字时,该应用程序会显示学生的名字和最终字母等级。我已经用名称设置了微调器,我已经从存储在资产中的文本文件中读取了名称和等级。我使用StringBuilder将该文件中的所有信息拆分为一个字符串数组。我想将这些数据解析成一个名为Student的对象,这样我就可以处理每个学生的成绩,但我不知道如何做到这一点。感谢您的帮助! 文本文件: 到目前为止

  • 问题内容: 我正在尝试使用mapper进行解析以将大JSON解析为java对象。我有一个很大的JSON,但遇到了其中的这一小片段,不确定如何解析。 这是JSON,其格式看起来几乎没有什么不同。我试图了解如何将其解析为对象。 我不知道它采用哪种格式,以及如何将其解析为对象。 问题答案: 这取决于你的身材有多大。如果可以将其加载到内存,则可以使用最简单的方法: 解决方案1: POJO类: 用法: 上面

  • 问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能重复: 如何从文件内容创建Java字符串 我有一个HTML文件,我想用它来提取信息。为此,我正在使用Jsoup。现在使用Jsoup,我需要将html文件转换为字符串。我怎样才能做到这一点? 现在,我想要一个String对象,其中包含html文件中的内容。 问题答案: 我使用apache common IO将文本文件读取为单个字符串 简单

  • 问题内容: 我目前正在尝试将收到的JSON对象转换为具有相同属性的TypeScript类,但无法使其正常工作。我究竟做错了什么? 员工阶层 员工字符串 我的尝试 链接到打字稿游乐场 问题答案: 编译器允许您将返回的对象强制转换为类的原因是因为typescript基于结构子类型。 您实际上并没有的实例,而是拥有一个具有相同属性的对象(如在控制台中看到的)。 一个简单的例子: (操场上的代码) 没有错

  • 可能重复: 如何将对象数组转换为字符串数组在Java 我接收一个对象,并将其转换成一个字符串数组,如下所示: 有没有更好更干净的方法可以做到这一点?

  • 我试图将下面的Json数组转换为特定的Java对象。 编辑:更新了正确的JSON结构 下面是我目前使用的对象映射器: 然而,我在尝试反序列化com时出错。fasterxml。杰克逊。数据绑定。exc.MismatchedInputException:无法反序列化来自数组值