仅在对象名jaxb中省略名称空间前缀

时间:2016-03-01 18:56:33

标签: java xml jaxb rss

我正在使用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名称空间的一部分

1 个答案:

答案 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();