5

現在、JAXB を使用して xml ファイルを解析しています。xsd ファイルを介して必要なクラスを生成しました。ただし、受け取った xml ファイルには、生成されたクラスで宣言されたすべてのノードが含まれているわけではありません。以下は、私の xml ファイルの構造の例です。

<root>
<firstChild>12/12/2012</firstChild> 
<secondChild>
<firstGrandChild>
<Id>
  </name>
  <characteristics>Description</characteristics> 
  <code>12345</code>
</Id>
</firstGrandChild>
</secondChild>
</root>

私は次の2つのケースに直面しています:

  1. ノード<name>は生成されたクラスに存在しますが、XML ファイルには存在しません
  2. ノードに値がありません

どちらの場合も、値は null に設定されます。ノードが XML ファイルに存在しない場合と、存在するが null 値を持つ場合を区別できるようにしたいと考えています。検索しても、その方法がわかりませんでした。どんな助けでも大歓迎です

お時間を割いてご協力いただき、誠にありがとうございました

よろしく

4

1 に答える 1

3

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 はまた、空のノードを空の値を持つものとして扱いますString

Java モデル

import javax.xml.bind.annotation.XmlRootElement;

@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/出力

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <foo></foo>
</root>
于 2013-04-05T17:12:14.150 に答える