JAXB @XmlSchema位置被忽略

时间:2015-03-23 18:10:35

标签: java xml groovy jaxb

我正在尝试使用JAXB生成sitemap.xml,并且忽略了location属性(我想在我的根元素上生成xsi:schemaLocation属性)。

我想生成一个xml,如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<ns3:urlset 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ns3="http://www.sitemaps.org/schemas/sitemap/0.9"
    xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
        http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
    <urls>
        <loc>http://domain.com</loc>
    </urls>
    <urls>
        <loc>http://domain.com/test</loc>
    </urls>
</ns3:urlset>

我见过其他问题: @xmlSchema annotation use with jaxbHow to generate the correct sitemap namespace using JAXB and Spring @ResponseBody in controller?

但这些都没有解决我使用注释遇到的问题。

我有以下package-info:

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://www.sitemaps.org/schemas/sitemap/0.9",
    xmlns = @javax.xml.bind.annotation.XmlNs( prefix = "xsi", namespaceURI="http://www.w3.org/2001/XMLSchema-instance" ),
    location = "http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd",
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED
)
package com.domain.site.sitemap

然而,我的单元测试:

@Test public void createXmlObject(){
    List urls = [ "test1", "test2", "test3" ]
    Sitemap map = new Sitemap( urls )
    JAXBContext jaxbContext = JAXBContext.newInstance( Sitemap )
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller()
    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true)
    jaxbMarshaller.marshal(map, System.out)
}

生成根元素,如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns3="http://www.sitemaps.org/schemas/sitemap/0.9">

如果我更新测试以使用jaxbMarshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "location..")显式设置位置,那么它将被填充 - 但我想理解它为什么不使用注释。

1 个答案:

答案 0 :(得分:1)

根据specification

  

实施者[...]

的注意事项      

但是,允许使用模式生成器   在schemaLocation属性中使用不同的值(包括not   例如,生成这样的属性),以便用户可以指定   通过命令行界面的资源的本地副本。

如果生成了位置,那么它取决于实现提供者。