Я пытаюсь создать sitemap.xml с помощью JAXB, и атрибут 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 аннотации с jaxb и Как создать правильное пространство имен sitemap, используя JAXB и Spring @ResponseBody в контроллере?
Но ни одна из них не решает проблему, которую я испытываю с помощью аннотации.
У меня есть следующая информация о пакете:
@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
Однако мой unit тест:
@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..")
тогда он будет заполнен, но я хочу понять, почему он не работает с аннотацией.
Согласно спецификации:
Примечание для разработчика [...]
Однако генератору схемы разрешено использовать другое значение в атрибуте schemaLocation (включая не генерирование такого атрибута), например, так, чтобы пользователь мог указать локальную копию ресурса через интерфейс командной строки.
Таким образом, это зависит от поставщика реализации, если оно создано или нет.
no
. Пытался углубиться в источники, но это заняло слишком много времени.