JAXB 未正确解析默认命名空间
JAXB not parsing default namespace correctly
我正在编写一些代码来解析 GPX 文件。这些是由许多不同的来源产生的,从路线规划网站到卫星导航记录。
我在使用 JAXB 时遇到问题。如果使用默认名称 space.
似乎不会加载文件
例如,当我尝试解析以下文件时,仅加载根 gpx
元素,未加载子 meta
并且 java 将该字段留空。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" 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">
<metadata>
<time>2015-01-24T18:13:23Z</time>
<bounds minlat="52.058110" minlon="-2.218540" maxlat="52.347110" maxlon="-1.943840" />
</metadata>
<!-- snip -->
</gpx>
但是以下文件加载正常。唯一的区别是默认名称 space 已更改为命名名称 (ns1
)。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ns1:gpx xmlns:ns1="http://www.topografix.com/GPX/1/1" 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">
<metadata>
<time>2015-01-24T18:13:23Z</time>
<bounds minlat="52.058110" minlon="-2.218540" maxlat="52.347110" maxlon="-1.943840" />
</metadata>
<!-- snip -->
</ns1:gpx>
我的包-info.java 当前定义为:
/**
* Pojos Representing the GPX xml.
*/
@XmlSchema(
elementFormDefault = XmlNsForm.UNQUALIFIED,
namespace = "http://www.topografix.com/GPX/1/1",
location = "http://www.topografix.com/GPX/1/1/gpx.xsd",
xmlns= {
@XmlNs(namespaceURI = "http://www.topografix.com/GPX/1/1", prefix = "gpx"),
}
)
package couling.gpxTools.pojo;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
这是其他人以前见过的吗?有没有关于如何绕过它的建议?
在您的第二个 XML 中,所有元素都应具有 ns1
前缀,以等同于第一个 XML 文档。
要加载第一个文档,您需要在 @XmlSchema
注释上指定 elementFormDefault=XmlNsForm.QUALIFIED
。然后此包内的所有映射元素将默认具有此命名空间。由于您指定了 UNQUALIFIED
只有顶级元素才能获得命名空间资格。
我正在编写一些代码来解析 GPX 文件。这些是由许多不同的来源产生的,从路线规划网站到卫星导航记录。
我在使用 JAXB 时遇到问题。如果使用默认名称 space.
似乎不会加载文件例如,当我尝试解析以下文件时,仅加载根 gpx
元素,未加载子 meta
并且 java 将该字段留空。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" 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">
<metadata>
<time>2015-01-24T18:13:23Z</time>
<bounds minlat="52.058110" minlon="-2.218540" maxlat="52.347110" maxlon="-1.943840" />
</metadata>
<!-- snip -->
</gpx>
但是以下文件加载正常。唯一的区别是默认名称 space 已更改为命名名称 (ns1
)。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ns1:gpx xmlns:ns1="http://www.topografix.com/GPX/1/1" 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">
<metadata>
<time>2015-01-24T18:13:23Z</time>
<bounds minlat="52.058110" minlon="-2.218540" maxlat="52.347110" maxlon="-1.943840" />
</metadata>
<!-- snip -->
</ns1:gpx>
我的包-info.java 当前定义为:
/**
* Pojos Representing the GPX xml.
*/
@XmlSchema(
elementFormDefault = XmlNsForm.UNQUALIFIED,
namespace = "http://www.topografix.com/GPX/1/1",
location = "http://www.topografix.com/GPX/1/1/gpx.xsd",
xmlns= {
@XmlNs(namespaceURI = "http://www.topografix.com/GPX/1/1", prefix = "gpx"),
}
)
package couling.gpxTools.pojo;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
这是其他人以前见过的吗?有没有关于如何绕过它的建议?
在您的第二个 XML 中,所有元素都应具有 ns1
前缀,以等同于第一个 XML 文档。
要加载第一个文档,您需要在 @XmlSchema
注释上指定 elementFormDefault=XmlNsForm.QUALIFIED
。然后此包内的所有映射元素将默认具有此命名空间。由于您指定了 UNQUALIFIED
只有顶级元素才能获得命名空间资格。