2011-08-10 60 views
15

我試圖根據定義的模式將對象內的數據編組爲一個xml文件。但是,當我打印出XML文件時,我在xml標籤上收到額外的註釋。有沒有辦法擺脫額外的名稱空間註釋(即ns2)Java:編組對象 - 在xml中刪除多餘的ns2註釋

這是我從編組接收到的xml示例。

<?xml version="1.0" encoding="UTF-8" standalone="yes"> 
<root xmlns:ns2="http://www.something.com/something"> 
    <ns2:food>steak</ns2:food> 
    <ns2:beverage>water</ns2:beverage> 
</root> 

我想是這樣的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"> 
<root xmlns="http://www.something.com/something"> 
    <food>steak</food> 
    <beverage>water</beverage> 
</root> 

這是我的Java代碼是幹什麼:

  JAXBContext context = JAXBContext.newInstance("com.schema"); 
      JAXBElement<FoodSchema> element = new JAXBElement<FoodSchema> 
       (new QName("FoodSchema"), Food.class, foodSchema); 
      Marshaller marshaller = context.createMarshaller(); 
      OutputStream os = new FileOutputStream(object.getFilePath()); 
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
      marshaller.marshal(element, os); 

任何幫助,非常感謝!謝謝!

+0

我能夠用XSLT做到這一點說明如下:http://stackoverflow.com/questions/25033285/remove-namespace- from-xml-in-java – Alex

回答

16

通過向用於構造JAXB元素的QName添加名稱空間URI(「http://www.something.com/something」),並利用程序包級別@XmlSchema註釋將爲您提供您所在的名稱空間限定尋找:

包信息

@XmlSchema(
    namespace="http://www.something.com/something", 
    elementFormDefault=XmlNsForm.QUALIFIED) 
package forum7014746; 

import javax.xml.bind.annotation.*; 

食品

package forum7014746; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Food { 

    private String food; 
    private String beverage; 

    public String getFood() { 
     return food; 
    } 

    public void setFood(String food) { 
     this.food = food; 
    } 

    public String getBeverage() { 
     return beverage; 
    } 

    public void setBeverage(String beverage) { 
     this.beverage = beverage; 
    } 

} 

演示

package forum7014746; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBElement; 
import javax.xml.bind.Marshaller; 
import javax.xml.namespace.QName; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jaxbContext = JAXBContext.newInstance(Food.class); 

     Food foodSchema = new Food(); 
     foodSchema.setFood("steak"); 
     foodSchema.setBeverage("water"); 

     JAXBElement<Food> element = new JAXBElement<Food> (new QName("http://www.something.com/something","FoodSchema"), Food.class, foodSchema); 

     Marshaller marshaller = jaxbContext.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(element, System.out); 
    } 

} 

輸出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<FoodSchema xmlns="http://www.something.com/something"> 
    <beverage>water</beverage> 
    <food>steak</food> 
</FoodSchema> 
+1

完美!我不必添加包信息註釋標籤以使其工作。在QName中添加額外的模式名稱空間位置就足夠了。再次感謝! – user459811

+0

這幫了我,我發送了一個不同於模式中定義的URI,並且導致resultXMLstring有另一個名稱空間 – viruskimera

3

謝謝回答。爲了給之前的示例代碼 :

marshaller.marshal(new JAXBElement(new QName(**""**,"Document"),Document.class,swiftDoc), sw); 

後:

marshaller.marshal(new JAXBElement(new QName(**"http://www.w3.org/2001/XMLSchema**","Document"),Document.class,swiftDoc), sw); 

和額外的 「NS:」 已被刪除。

3

添加到XSD架構定義將elementFormDefaultattributeFormDefault

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" ... 
elementFormDefault="qualified" attributeFormDefault="unqualified" ... >