2009-02-27 14 views
8

JAXBを使用してXMLメッセージを作成します。私が作成する必要があるXMLは、(簡略化のために)です:JAXBで空の要素をインスタンス化する方法

<request> 
    <header/> 
</request> 

私のコードは次のようになります。

import javax.xml.bind.annotation.*; 

@XmlRootElement(name = "request") 
public class Request { 

    private String header; 

    @XmlElement(required=true) 
    public String getHeader() { 
     return header; 
    } 

    public void setHeader(String header) { 
     this.header=header; 
    } 
} 

問題:header要素が表示されていない(ヘッダがnullです)。ヘッダが空の文字列に設定されている場合、以下が表示されます

<request> 
    <header></header> 
</request> 

IタイプObject代わりStringのように使用し、結果はさらに悪くなる。

<request> 
    <header xsi:type="xs:string" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></header> 
</request> 

をBTW:私が使用していますthis codeを使用してXML文字列を作成します。

空のタグを取得することはできますか?

+0

だから、ヘッダーを設定すると間違っているものに「」: - ではなく、空の文字列より - NULL値があるので

は正しい結果が生成されます、私はnullに明示的に値を設定するには、私のsetterメソッドを修正しました? –

+0

​​を入力し、

を入力しないでください。 – doekman

+0

@doekmanええ、私はそれが遅れていることを知っていますが、ちょうどの場合。あなたが望むものを正確に行うには、JAXBの[EclipseLink MOXy](http://www.eclipse.org/eclipselink/moxy.php)実装を使用することができます。JAXBには、非常に素晴らしい拡張子@XmlNullPolicyがあります。例[here](http://stackoverflow.com/a/11748678/814702)(「オプション#2」セクション内) – informatik01

答えて

11

XMLでは、<header/><header></header>は同じものです。あなたは本当に前者が必要な場合は、プリティファイヤーを使用してください。 javax.xml.transform.TransformerFactory.newTransformer()がそうするでしょう。

+4

こんにちは@Tom。あなたはそれを行う方法を少し詳細に説明できますか? – Vladimir

2

Stringオブジェクトの空のタグは、基本的に空の文字列です。

次を呼び出す場合、あなたが探しているものを取得します:

request.setHeader("") 

私はまた、XMLのヘッダの次の2つの宣言がidentialであることに注意すべきです。これらの両方に子テキストノードはありません。これらは本質的に同じであり、すべてのXMLパーサーで同じように扱われます:@Tomホーティンとして

<header></header> 

<header/> 
2

- tacklineは

<header/><header></header>が同じであると述べました。パーサーがあなたに ""を与えます。

あなたは、私は、このコードはnull値のためにXMLを以下の生成を願っていますあなたのヘッダー注釈

@XmlElement(nillable=true, required=true) 
public String getHeader() { 
    return header; 
} 

nillableを配置する必要があります。

import javax.xml.bind.*; 
import javax.xml.bind.annotation.*; 

@XmlRootElement 
public class Request { 

    public static void main(String[] args) throws JAXBException { 
     final Request request = new Request(); 
     final JAXBContext context = JAXBContext.newInstance(Request.class); 
     final Marshaller marshaller = context.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, 
           Boolean.TRUE); 
     marshaller.marshal(request, System.out); 
     System.out.flush(); 
    } 

    @XmlElement(nillable=true, required=true) 
    private String header; 
} 

プリント

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<request> 
    <header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/> 
</request> 
0

私は効果的に<header/>むしろ<header></header> よりもXMLシリアル化プロセスの間に、同じことを望んでいました。

public void setHeader(String header) { 
    this.header = "".equals(header) ? null : header; 
} 
関連する問題