2015-03-23 3 views
1

Я пытаюсь сгенерировать файл sitemap.xml с помощью JAXB, и атрибут location игнорируется (я хочу сгенерировать атрибут xsi:schemaLocation на моем корневом элементе).JAXB @XmlSchema location ignored

Я хочу, чтобы сгенерировать 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 jaxb и How to generate the correct sitemap namespace using JAXB and Spring @ResponseBody in controller?

Но ни один из них решить эту проблему я испытываю с аннотацию.

Я следующий пакет-инфо:

@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

В соответствии с specification:

Примечание к Implementor [...]

Однако генератор схемы разрешено использовать другое значение в атрибуте SchemaLocation (в том числе не генерации таких атрибут), например, чтобы пользователь мог указать локальную копию ресурса через интерфейс командной строки.

Таким образом, это зависит от поставщика реализации, если оно создано или нет.

+0

Спасибо - я заметил это в документах, но поскольку мой тест просто использует простой JAXB (JAXBContenxt создает javax.xml.bind.Marshaller), я надеялся, что они его осуществили. Я предполагаю, что это означает, что нет? – rhinds

+1

Похоже на 'no'. Пытался разбудить источники, но это заняло слишком много времени. –