我正在使用jaxb创建一个RSS源,尝试按照谷歌的rss 2.0规范来制作产品。
我创建了我的根对象并设置了
@XmlElement(name = "id", namespace="http://base.google.com/ns/1.0")
并创建了我自己的前缀映射器以生成前缀(我知道我可以使用package-info但不希望将命名空间分配给我的所有子元素)
marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapper() {
@Override
public String getPreferredPrefix(String uri, String arg1, boolean arg2) {
return uri.equals("http://base.google.com/ns/1.0") ? "g" : "";
}
});
但是,我生成的根元素xml是:
<g:rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">
当我想要的结果是这样的时候:
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0" >
如何从我的名字中有选择地省略前缀?据我所知,元素名称rss不是google名称空间的一部分
答案 0 :(得分:0)
我通过使用自己的xmlstreamwriter解决了这个问题,只是手动编写根节点并将其余的对象写为xml片段:
marshaller = context.createMarshaller();
marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapper() {
@Override
public String getPreferredPrefix(String uri, String arg1, boolean arg2) {
return uri.equals("http://base.google.com/ns/1.0") ? "g" : "";
}
});
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
FileWriter fileWriter = new FileWriter(file);
XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(fileWriter);
writer.writeStartDocument();
writer.writeStartElement("rss");
writer.writeAttribute("version", "2.0");
writer.writeNamespace("g", "http://base.google.com/ns/1.0");
for (MyObject o : objects)
{
marshaller.marshal(o, writer);
writer.writeCharacters("\n");
}
writer.writeEndElement();
writer.writeEndDocument();
writer.close();