2011-08-10 12 views
15

定義済みのスキーマに基づいて、オブジェクト内のデータをXMLファイルにマーシャリングしようとしています。しかし、xmlファイルを出力すると、xmlタグに余分な注釈が付けられます。余分な名前空間の注釈(ns2)を取り除く方法はありますか?Java:オブジェクトのマーシャリング - xmlで追加のns2アノテーションを削除する

これはマーシャリングから受け取ったxmlの例です。

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

すべてのヘルプははるかに高く評価されて

<?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> 

私が欲しいのはこのようなものです!ありがとう!

+0

: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; 
    } 

} 
0:探し答えを

デモ

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に追加します。私はここで説明するXSLTでこれを行うことができた

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" ... 
elementFormDefault="qualified" attributeFormDefault="unqualified" ... > 
関連する問題