【问题标题】:jaxb unmarshalling with namespacejaxb 使用命名空间解组
【发布时间】:2014-11-07 07:41:11
【问题描述】:

这是我的xml,需要转换成java。我用过jaxb

<?xml version="1.0"?>
<lm:order Id="PLG24M240U" JD="" aCount="2" SUCount="1" xmlns:lm="http://www.ae.com/Event/Load">
  <lm:master>
   <lm:ID>3</lm:ID>
    <lm:Number>313</lm:Number>
    <lm:ANumber>323</lm:ANumber>     
  </lm:master>
  <lm:detail>
    <lm:ID>3</lm:ID>
    <lm:Number>3131</lm:Number>
    <lm:ANumber>3232</lm:ANumber>      
  </lm:detail>
 <lm:detail>
    <lm:ID>3</lm:ID>
    <lm:Number>3131</lm:Number>
    <lm:ANumber>3232</lm:ANumber>    
  </lm:detail>
  <lm:detail>
    <lm:ID>3</lm:ID>
    <lm:Number>313</lm:Number>
    <lm:ANumber>323</lm:ANumber>    
  </lm:detail>
</lm:order>

并抛出以下异常 javax.xml.bind.UnmarshalException:意外元素(uri:“http://www.ae.com/Event/Load”,本地:“订单”)。预期元素是

这是我的解组代码

jaxbContext = JAXBContext.newInstance(Order.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Order order = (Order) jaxbUnmarshaller.unmarshal(file);
System.out.println(order );

订购 Pojo 类

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "lm:Order")
public class OrderPay {
    @XmlAttribute
    private String Id;
    @XmlAttribute
    private String JD;
    @XmlAttribute
    private String aCount;
    @XmlAttribute
    private String pCount;
    /*@XmlElement
    private Master master;
    @XmlElement
    private List<Detail> details = new ArrayList<Detail>();*/

}

能否请您帮助我阅读,目前正在阅读文件,需要读取为 XML 字符串。

【问题讨论】:

  • @isim :是的,这是一个错字,代码中没有编译时错误。谢谢

标签: java xml-parsing namespaces jaxb


【解决方案1】:

命名空间属性xmlns:lm="http://www.ae.com/Event/Load" 可能是这里的罪魁祸首。为了指定命名空间前缀,您可以将@XmlSchema 注解添加到package-info.java 文件中,如下所示:

@XmlSchema(
    namespace="http://www.ae.com/Event/Load",
    elementFormDefault=XmlNsForm.QUALIFIED),
    xmlns={@XmlNs(prefix="lm", namespaceURI="http://www.ae.com/Event/Load")})  

package your.package;
import javax.xml.bind.annotation.*;

【讨论】:

  • 是的,该错误现在不存在了。但是响应是空的。 System.out.println(order.getACount);为空
  • StringReader reader = new StringReader("// 整个 xml"); jaxbContext = JAXBContext.newInstance(Order.class);解组器 jaxbUnmarshaller = jaxbContext.createUnmarshaller();订单 order = (Order) jaxbUnmarshaller.unmarshal(reader); System.out.println(order);
  • @Rosh 我在您的 XML 中没有看到 aCount 属性;只有一个Count 属性。他们应该是一样的吗?
  • 不,这是错字。响应值仅为 null。
  • @Rosh 所以你的意思是System.out.println(order);null?您是否将您的 @XmlRootElement(name = "lm:Order") 更改为 @XmlRootElement(name = "Order")
猜你喜欢
  • 1970-01-01
  • 2015-04-25
  • 2013-10-24
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多