簡體   English   中英

JAXB:從XML子樹解組嗎?

[英]JAXB: unmarshal from XML subtree?

我的JAVA程序使用類似於GPX 1.1的內部類層次結構,但不完全相同。 由於要重寫它以使其與GPX 1:1相適應是一項巨大的工作,因此我想一點一點地更改它,即將<metadata>子樹讀入XSD文件中使用xjc生成的Class MetadataType中。

剩余的GPX文件將使用DOM進行解析,直到顯示<metadata>為止:

private void parseMetadata(MetadataType metadata, Element element) throws JAXBException {
    try {
        System.out.println(element.getNodeName()); // output: metadata
        JAXBContext context = JAXBContext.newInstance(MetadataType.class);

        javax.xml.bind.Unmarshaller u = context.createUnmarshaller();

        JAXBElement<MetadataType> meta = u.unmarshal(element, MetadataType.class);
        metadata = meta.getValue();

        } catch (Exception e) { 
            e.printStackTrace();
        }
    System.out.println(metadata.getName()); // NULL
    System.out.println(metadata.getAuthor().getName()); // NULL
}

引發javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"metadata"). Expected elements are <{http://www.topografix.com/GPX/1/1}gpx> at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:647) javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"metadata"). Expected elements are <{http://www.topografix.com/GPX/1/1}gpx> at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:647)

該類如下所示:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "metadataType", propOrder = {
"name",
"desc",
"author",
"copyright",
"link",
"time",
"keywords",
"bounds",
"extensions"
})
@XmlRootElement(name = "metadata")
public class MetadataType {

protected String name = "";
protected String desc = "";
protected PersonType author;
protected CopyrightType copyright = new CopyrightType();
protected List<LinkType> link = new ArrayList<LinkType>();
@XmlSchemaType(name = "Date")
protected Date time;
protected String keywords = "";
protected BoundsType bounds = new BoundsType();
protected ExtensionsType extensions = new ExtensionsType();
[...]
}

是否可以從XML子樹中解組; 如果是,我在做什么錯?

UPDATE / 1:感謝lexicore,我又走了一步: element絕對包含metadata節點,已設置@XmlRootElement ,現在使用unmarshal(element, MetadataType.class)進行unmarshal(element, MetadataType.class)

解組工作,但對象的內容為空。 我想知道我是否在這里遇到了一些命名空間方面的麻煩?

軟件包com.topografix.gpx._1._1包含xjc生成的package-info.java:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.topografix.com/GPX/1/1", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.topografix.gpx._1._1;

這是測試文件之一:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" 
xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" 
xmlns:wptx1="http://www.garmin.com/xmlschemas/WaypointExtension/v1" 
xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" 
creator="GPSMAP 62s" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 
http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas /GpxExtensions/v3 
http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/WaypointExtension/v1 
http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 
http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">
<metadata>
<link href="http://www.garmin.com">
<text>Garmin International</text>
</link>
<time>2014-01-01T22:26:49Z</time>
</metadata>
[...]

UPDATE / 2:名稱空間/程序包名稱正確。 如果命名空間設置為(即)“ foobar”,則將引發以下異常: javax.xml.bind.JAXBException: Provider com.sun.xml.internal.bind.v2.ContextFactory could not be instantiated: javax.xml.bind.JAXBException: "foobar" doesnt contain ObjectFactory.class or jaxb.index

與以前一樣初始化時,不會引發異常,這意味着名稱空間正確並且找到了ObjectFactory.class。

String contextPath = MetadataType.class.getPackage().getName(); JAXBContext context = JAXBContext.newInstance(contextPath);

因此,名稱空間是正確的,但是以某種方式缺少與MetadataType類的“鏈接”嗎?

我想您在這里遇到一些問題:

  • 您的MetadataType沒有@XmlRootElement 所以JAXB不知道哪個元素應該匹配它。
  • 您想部分解組,但您要解組(我想)整個文檔。

您可以嘗試的方法:

  • 嘗試使用unmarshal(node,class)方法從特定節點解組特定類
  • 從堆棧跟蹤中,您嘗試解組gpx:gpx元素,而不是metadata元素。 你必須更深入
  • 您還必須超過package-info.java (或在MetadataType提供名稱空間,否則您將缺少名稱空間
  • 請參閱有關部分解組的答案。

暫無
暫無

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

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