解析肥皂消息

时间:2015-09-14 08:05:46

标签: java xml soap jaxb

我收到肥皂信息,但无法解析参数列表中的所有值。

参考:http://blog.bdoughan.com/2012/08/handle-middle-of-xml-document-with-jaxb.html

我遵循了这一点,但我的数据具有多重价值。它只能解析一个。我该怎么办

XML数据

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <env:Header />
    <env:Body>
        <m:ExecuteServiceResponse xmlns:m="http://com/myproject/sff/ws">
            <m:return>
                <java:ErrorMessage xmlns:java="java:com.myproject.sff.domain.gm.vo.ws"/>
                <java:ParameterList xmlns:java="java:com.myproject.sff.domain.gm.vo.ws">

                        <java:Parameter>
                            <java:Name>success</java:Name>
                            <java:Value xsi:nil="true"/>
                        </java:Parameter>   

                       <java:Parameter>
                            <java:Name>productID</java:Name>
                            <java:Value>T3452789</java:Value>
                        </java:Parameter>

                        <java:Parameter>
                            <java:Name>productName</java:Name>
                            <java:Value>some</java:Value>
                        </java:Parameter>

                </java:ParameterList>
            </m:return>
        </m:ExecuteServiceResponse>
    </env:Body>
</env:Envelope>

我的代码

main.java

XMLInputFactory xif = XMLInputFactory.newFactory();
    StreamSource xml = new StreamSource("msg/input.xml");
    XMLStreamReader xsr = xif.createXMLStreamReader(xml);

    xsr.nextTag();


    while(!xsr.getLocalName().equals("Parameter")) {

        xsr.nextTag();
    }

    JAXBContext jc = JAXBContext.newInstance(Parameter.class);
    Unmarshaller unmarshaller = jc.createUnmarshaller();

    JAXBElement<Parameter> jb = unmarshaller.unmarshal(xsr, Parameter.class);

    xsr.close();

    Parameter Parameter = jb.getValue();

    System.out.println(Parameter.Name);
    System.out.println(Parameter.Value);

Parameter.java

    @XmlAccessorType(XmlAccessType.FIELD)
public class Parameter {

    @XmlElement(namespace="java:com.myproject.sff.domain.gm.vo.ws")
    String Name;
    @XmlElement(namespace="java:com.myproject.sff.domain.gm.vo.ws")
    String Value;

    @XmlElement(name = "Parameter")
      private List<Parameter> Parameter;         
      public List<Parameter> getCustomer (){
        if( Parameter == null ){
            Parameter = new ArrayList<Parameter>();
        }
        return Parameter;
      }

}

1 个答案:

答案 0 :(得分:0)

你不能只是解组这样的元素,它们必须用其他元素包装,例如:

<java:ParameterList xmlns:java="java:com.myproject.sff.domain.gm.vo.ws">
                     <java:ParList>
                        <java:Parameter>
                            <java:Name>success</java:Name>
                            <java:Value xsi:nil="true"/>
                        </java:Parameter>   

                       <java:Parameter>
                            <java:Name>productID</java:Name>
                            <java:Value>T3452789</java:Value>
                        </java:Parameter>

                        <java:Parameter>
                            <java:Name>productName</java:Name>
                            <java:Value>some</java:Value>
                        </java:Parameter>
                     <java:ParList>
                </java:ParameterList>

然后将代码更改为:

 @XmlElementWrapper(name = "ParList")
 @XmlElement(name = "Parameter")
 private List<Parameter> Parameter;         

我不完全确定你的参数周围有<java:ParameterList>,但也许你也可以使用它。