Невозможно удалить с помощью @XmlAttribute - PullRequest
2 голосов
/ 07 декабря 2011

Я могу маршаллировать свою карту сайта с помощью JAXB, хотя я не могу ее удалить!Любая помощь будет принята с благодарностью.

Я получаю следующее исключение:

javax.xml.bind.UnmarshalException: непредвиденный элемент (uri: "http://www.sitemaps.org/schemas/sitemap/0.9", local:" urlset "). Ожидаемые элементы: <{} urls>, <{} urlset>

URL карты сайта:

@XmlRootElement(name = "urlset")
public class XMLURLSet
{
   List<XMLURL> urls;
   final String xmlns = "http://www.sitemaps.org/schemas/sitemap/0.9";

   @XmlAttribute(name = "xmlns")
   public String getXmlns() {
      return xmlns;
   }

   public void setXmlns(String xmlns) {
      // nop
   }

   @XmlElement(name = "url")
   public List<XMLURL> getUrls(){
      return urls;
   }

   public void setUrls(List<XMLURL> urls) {
      this.urls = urls;
   }

URL карты сайта:

@XmlRootElement(name = "urls")
public class XMLURL {
   String loc;

   public String getLoc() {
      return loc;
   }

   public void setLoc(String loc) {
      this.loc = loc;
   }
}

ВыводXML (это правильно):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>http://www.example.com</loc>
    </url>
</urlset>

Код JUnit, который работает

JAXBContext context = JAXBContext.newInstance(XMLURLSet.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");

StringWriter sw = new StringWriter();
marshaller.marshal(urlSet, sw);
String xml =  sw.toString();

Отмена того, что НЕ РАБОТАЕТ (продолжение сверху):

JAXBContext ctx = JAXBContext.newInstance(XMLURLSet.class);
Unmarshaller umsler = ctx.createUnmarshaller();
XMLURLSet xmlUrlSet = (XMLURLSet) umsler.unmarshal(new StreamSource(new StringReader(xml)));

последняя строка генерирует исключение:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.sitemaps.org/schemas/sitemap/0.9", local:"urlset"). Expected elements are <{}urls>,<{}urlset>

1 Ответ

2 голосов
/ 07 декабря 2011

Проблема в том, как вы пытаетесь определить пространство имен для вашего документа. Вам потребуется добавить класс с именем package-info в тот же пакет, что и классы вашего домена, со следующей записью:

пакет-информация

@XmlSchema(
    namespace = "http://www.sitemaps.org/schemas/sitemap/0.9",
    elementFormDefault = XmlNsForm.QUALIFIED)
package your.package.name;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

Для получения дополнительной информации

...