【问题标题】:XML unmarshalling using JAXB使用 JAXB 解组 XML
【发布时间】:2013-01-17 12:15:05
【问题描述】:

我有一个要解组的 XML 文件,但我不知道该怎么做。

XML 看起来像

<config>
    <params>
        <param>
            <a>draft</a>
            <b>Serial</b>
        </param>
        <param>
            <a>amt</a>
            <b>Amount</b>
        </param>
    </params>
    <server>
        <scheme>http</scheme>
        <host>somehost.com/asdf</host>
    </server>
</config>

当我有参数作为根元素并且没有服务器元素或配置作为根元素时,我以前可以解组。

我添加了一个配置类来尝试解组这个,但我不知道我哪里出错了。

我的课看起来像

@XmlRootElement
public class Config {

    private Params params = new Params();

    @XmlElement(name="params")
    public Params getParams() {
        return params;
    }
    public void setParam(Params params) {
        this.params = params;
    }
}

public class Params {
    private List<Param> params = new ArrayList<Param>();

    public List <Param> getParam() {
        return params;
    }

    public void setParam(List<Param> params) {
        this.params = params;
    }
}

public class Param {
    String a;
    String b;        
    //getters and setters.  omitted for brevity     
}   

解组代码

File file = new File("C:\\config.xml");
InputStream inputStream = new FileInputStream(file);
JAXBContext jc = JAXBContext.newInstance(Config.class);
Unmarshaller u = jc.createUnmarshaller();
conf = (Config) u.unmarshal(file);
System.out.println(conf.getParams().getParam().size());

println 打印 0。我哪里出错了?

我知道我还没有任何服务器节点的代码,还没有到达那里。我的实际 XML 还没有那个节点,我仍然无法让它在 config 标记内正确解组参数。

【问题讨论】:

    标签: java xml jaxb unmarshalling


    【解决方案1】:

    试试

    @XmlRootElement
    class Config {
        private List<Param> params = new ArrayList<Param>();
    
        @XmlElementWrapper
        @XmlElement(name="param")
        public List<Param> getParams() {
            return params;
        }
    
        public void setParams(List<Param> params) {
            this.params = params;
        }
    }
    
    class Param {
        String a;
        String b;
              ...
    }
    

    【讨论】:

    • +1 - 顺便说一句,我从 @XmlElementWrapper 注释中删除了 name="params" 部分,因为 JAXB 将默认应用该名称。
    【解决方案2】:

    默认情况下,JAXB (JSR-222) 实现会将所有公共字段和属性视为已映射。属性被识别为具有匹配的 get/set 方法。您只需要将Config类中的setParam方法更改为setParams即可匹配getParams方法。

    @XmlRootElement
    public class Config {
    
        private Params params = new Params();
    
        public Params getParams() {
            return params;
        }
        public void setParams(Params params) {
            this.params = params;
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      您只需要进行以下更改即可。将 Config 中的 setParams 方法更改为

      @XmlElement(name = "params") //<--Annotation added here
      public void setParam(Params params) {
          this.params = params;
      }
      

      【讨论】:

        【解决方案4】:

        我认为 Param 和它的包装器都应该是 unmarsh。您只需解组列表即可。但 Param 模型也需要解组。

        【讨论】:

        • 你的建议和@Evgeniy Dorofeev一样吗?
        • '@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) 类参数 { 字符串 a;字符串 b; ... }'@user2034573
        • 将注释添加到字段中。试试这个。
        猜你喜欢
        • 2016-02-02
        • 1970-01-01
        • 1970-01-01
        • 2013-11-15
        • 1970-01-01
        • 2021-10-20
        • 1970-01-01
        相关资源
        最近更新 更多