Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB:从XML子树解组?_Java_Jaxb_Gpx - Fatal编程技术网

Java JAXB:从XML子树解组?

Java JAXB:从XML子树解组?,java,jaxb,gpx,Java,Jaxb,Gpx,我的JAVA程序使用一个类似GPX1.1的内部类层次结构,但并不完全相同。由于重写它使其符合GPX的1:1是一项巨大的工作,我想一点一点地修改它,即将子树读入类MetadataType,如从xjc生成的那样 剩余的GPX文件将使用DOM解析,直到显示: private void parseMetadata(MetadataType metadata, Element element) throws JAXBException { try { System.out.prin

我的JAVA程序使用一个类似GPX1.1的内部类层次结构,但并不完全相同。由于重写它使其符合GPX的1:1是一项巨大的工作,我想一点一点地修改它,即将
子树读入类
MetadataType
,如从xjc生成的那样

剩余的GPX文件将使用DOM解析,直到
显示:

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
}
以下是其中一个测试文件:

<?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>
[...]

佳明国际
2014-01-01T22:26:49Z
[...]
UPDATE/2:命名空间/包名称正确。如果名称空间设置为(即)“foobar”,则会引发以下异常:
javax.xml.bind.JAXBException:Provider com.sun.xml.internal.bind.v2.ContextFactory无法实例化:
javax.xml.bind.JAXBException:“foobar”不包含ObjectFactory.class或jaxb.index

当像以前一样初始化时,不会引发异常,这意味着名称空间是正确的,并且找到了ObjectFactory.class

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


因此,名称空间是正确的,但不知何故,到MetadataType类的“链接”丢失了?

我想您在这里遇到了一些问题:

  • 您的
    元数据类型
    没有
    @XmlRootElement
    。所以JAXB不知道应该匹配哪个元素
  • 您希望部分地解组,但您正在(我猜)解组整个文档
您可以尝试:

  • 尝试使用以下方法从特定节点解组特定类
  • 从堆栈跟踪中,您尝试解组
    gpx:gpx
    元素,而不是
    metadata
    元素。你必须更深入
  • 您还必须超越
    package info.java
    (或者在
    MetadataType
    中提供名称空间,否则您将缺少名称空间
  • 看看这个答案

多亏了您的回答,我现在更进一步了。问题在这方面得到了更新。是的,似乎是ns问题。请尝试使用包名而不是单个类来构建上下文。例如,JAXBContext.newInstance(MetadatatType.class.getPackage().getName())。命名空间似乎是正确的,但可能找不到指向该类的“链接”?
@XmlRootElement
是为MetadataType.class onlynMarshall(节点,类)方法设置的,为我工作!
@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>
[...]