2016-03-01 112 views
0

我正在使用jaxb創建rss供稿,試圖按照google的rss 2.0規範生成產品供稿。僅在對象名稱jaxb中省略命名空間前綴

我已經創建了我的根對象,並設置

 @XmlElement(name = "id", namespace="http://base.google.com/ns/1.0") 

,並創建了自己的前綴映射器生成的前綴(我知道我可以使用包的信息,但不希望被命名空間分配給我的所有孩子元素)

 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是不是谷歌的命名空間的一部分,據我可以告訴

+0

嗨,你能提供你的根對象的完整代碼?尤其是@XmlRootElement部分。謝謝 –

回答

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