簡體   English   中英

用Java讀取XML文件

[英]Reading XML files in Java

我有一個大的XML文件和幾個POJO clasess需要讀取這個XML。 當我嘗試用一​​個POJO讀取測試文件時我使用這個:

    JAXBContext jaxbContext = JAXBContext.newInstance(Test.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Test ts = (Test)jaxbUnmarshaller.unmarshal(file);
System.out.println(ts.getName());

但是當我有30個POJO時,我會做什么? 創建這4行30次? 給我建議。

UPDATE

我如何理解這個例子http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html使用幾個POGO我將使用

JAXBContext.newInstance("message:customer:product:order");

在這個考試中,autor有3個咒語,但只有兩個,他在@XmlRootElement注釋。 為什么?

您可以使用所有30個POJO創建JAXBContext。 您還可以將它們的名稱存儲在包中的jaxb.in​​dex索引文件中,並創建JAXBContext.newInstance(“your.package”)

以下是javadoc中 jaxb.in​​dex的一些細節

除了在上下文路徑中列出之外,程序員帶注釋的JAXB映射類可以在jaxb.in​​dex資源文件中列出,格式如下所述。 請注意,java包可以包含模式派生類和用戶注釋的JAXB類。 此外,java包可能包含必須處理的JAXB包注釋。 (參見JLS第3版,第7.4.1節“包注釋”)。

您的類應使用@XmlRootElement或@XmlType注釋進行注釋。

您還可以使用scannotation框架找到所有注釋為@XmlRootElement的類,並使用您擁有的所有JAXB POJO創建JAXBContext。

如果您有任何問題,請發表評論,我會更新答案。 希望能幫助到你。

理想情況下,您只需創建一次JAXBContext並將其緩存以便重復使用。 現在

但是當我有30個POJO時,我會做什么? 創建這4行30次?

如果所有30個POJO都在同一個包中(例如com.abc),則將上下文創建為JAXBContext.newInstance("com.abc")

在這個考試中,autor有3個咒語,但只有兩個,他就是@XmlRootElement注釋。 為什么?

只有與XSD Schema中的全局元素聲明對應的POJO才具有@XmlRootElement注釋。 這是因為全局元素聲明是實例文檔中的潛在根元素。

如果您可以發布XML Schema和XML實例文檔的示例,以便我們提供更具體的答案,那就更好了。

以下應該有所幫助。

說明一

JAXB模型類不需要任何注釋。 沒有注釋表明在創建JAXBContext時應自動處理類。

創建一個JAXBContext

創建JAXBContext有兩種主要方法

1 - 在課堂上

您傳入一個域類數組。 然后為這些類創建映射。 還會為引用創建映射(請參閱下面的“類別”)。

2 - 關於上下文路徑

我引用的文章( http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html )使用了上下文路徑。 上下文路徑由冒號分隔的包名稱組成。 每個包必須包含jaxb.index文件或ObjectFactory類。 jaxb.index文件是一個回車分隔的類名列表,您希望在其上創建JAXBContext 就像在類數組上創建JAXBContext ,也會處理引用類。

是什么類型的

下面是創建JAXBContext時處理哪些輔助類所涉及的一些關鍵概念。

1 - 參考類

如果在Foo類上創建了JAXBContext ,那么Bar也將被處理,因為它被Foo引用。

@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

    private List<Bar> bar;

}

2 - 超級課程

如果處理了一個類,那么它的超類也會被處理。 您可以將@XmlTransient注釋放在類上以防止它被處理(請參閱: http@XmlTransient )。

public class Foo extends Bar {
}

3 - 子類

如果處理了類,則不會自動處理其子類。 您可以在類上放置@XmlSeeAlso注釋以指定要處理的子類。

@XmlSeeAlso({Bar.class})
public class Foo {
}

4 - 從JAXB注釋引用的類

如果處理了類,則還會處理在該類中的JAXB注釋上指定的類

public class Foo {
    @XmlElements({
         @XmlElement(name="a", type=A.class),
         @XmlElement(name="b", type=B.class)
    })
    private Object bar;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM