[英]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.index索引文件中,並創建JAXBContext.newInstance(“your.package”)
以下是javadoc中 jaxb.index的一些細節
除了在上下文路徑中列出之外,程序員帶注釋的JAXB映射類可以在jaxb.index資源文件中列出,格式如下所述。 請注意,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.