使用JAXB处理丢失的节点

15 浏览
0 Comments

使用JAXB处理丢失的节点

我目前正在使用JAXB解析xml文件。我通过xsd文件生成所需的类。然而,我收到的xml文件并不包含在生成的类中声明的所有节点。以下是我的xml文件结构的示例:


12/12/2012



  
  Description
  [apcode]
12345

[/apcode]

我面临以下两种情况:

  1. 生成的类中存在节点,但在XML文件中不存在
  2. 节点没有值

在这两种情况下,值被设置为null。我希望能够区分节点在XML文件中不存在和节点存在但值为null的情况。尽管我进行了搜索,但我没有找到解决方法。非常感谢您提供帮助。

非常感谢您的时间和帮助

谢谢!

0
0 Comments

处理JAXB中缺失节点的问题

在JAXB(JSR-222)的实现中,如果节点不存在,set方法不会被调用。您可以在set方法中加入逻辑来跟踪它是否被调用。

public class Foo {
    private String bar;
    private boolean barSet = false;
    public String getBar() {
       return bar;
    }
    public void setBar(String bar) {
        this.bar = bar;
        this.barSet = true;
    }
}

更新

JAXB还将空节点视为具有空字符串值。

Java模型

import javax.xml.bind.annotation.XmlRootElement;
public class Root {
    private String foo;
    private String bar;
    public String getFoo() {
        return foo;
    }
    public void setFoo(String foo) {
        this.foo = foo;
    }
    public String getBar() {
        return bar;
    }
    public void setBar(String bar) {
        this.bar = bar;
    }
}

演示

import java.io.File;
import javax.xml.bind.*;
public class Demo {
    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum15839276/input.xml");
        Root root = (Root) unmarshaller.unmarshal(xml);
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }
}

input.xml/Output



    

我需要处理BigInteger数据类型和集合的相同情况,但对于BigInteger,布尔标志始终为false。

0