1

簡単なタスク:要素に2つの属性を記述します。

String nsURI = "http://example.com/";
XMLOutputFactory outF = XMLOutputFactory.newFactory();
outF.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true);
XMLStreamWriter out = outF.createXMLStreamWriter(System.out);
out.writeStartElement(XMLConstants.DEFAULT_NS_PREFIX, "element", nsURI);
out.writeAttribute("attribute", "value");
out.writeAttribute("attribute2", "value");
out.writeEndElement();
out.close();

ウッドストックスの答え:

<element xmlns="http://example.com/" attribute="value" attribute2="value"></element>

JDK 6の回答:

<zdef-1905523464:element xmlns="" xmlns:zdef-1905523464="http://example.com/" attribute="value" attribute2="value"></zdef-1905523464:element>

何?!

さらに、要素にプレフィックスを追加すると、次のようになります。

out.writeStartElement("ns", "element", nsURI);

JDK6はxmlns=""を発行しようとしなくなりました:

<ns:element xmlns:ns="http://example.com/" attribute="value" attribute2="value"></ns:element>

そして、属性を削除した場合(つまり、属性が1つしかない場合)は問題ありません。

これはJDK6のバグだと確信しています。そして、誰かが両方のライブラリ(および他のライブラリ)を幸せに保つ回避策を提案できますか?私がそれを助けることができるならば、私はwoodstoxを要求したくありません。

4

2 に答える 2

2

XMLStreamWriterデフォルトの名前空間を教えて、要素を追加するときにそれを使用する必要があると思います。

String nsURI = "http://example.com/";
XMLOutputFactory outF = XMLOutputFactory.newFactory();
outF.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true);
XMLStreamWriter out = outF.createXMLStreamWriter(System.out);
out.setDefaultNamespace(nsURI);
out.writeStartElement(nsURI, "element");
out.writeAttribute("attribute", "value");
out.writeAttribute("attribute2", "value");
out.writeEndElement();
out.close();

上記のコードは私にこの出力を与えます:

<element xmlns="http://example.com/" 
    attribute="value" attribute2="value"></element>

Javaバージョン「1.6.0_20」を使用

于 2010-06-18T12:11:30.900 に答える
1

私の提案は、writeAttribute()の2引数バージョンに依存しないことです。これは、出力する必要があるものの定義が明確でないためです。名前空間 ""(別名 "名前空間なし")または現在のデフォルトの名前空間を使用する必要があります。 ?XML仕様に従って、属性がデフォルトの名前空間を使用することはないため、これは特に混乱を招きます(明示的な名前空間のみ)。したがって、おそらく、表現されたすべての動作は、潜在的に正しいと見なすことができます。しかし、明らかにすべてがそうであることはできません。それは、Stax APIが本当の答えがどうあるべきか(それはひどい)を適切に定義していない(AFAIK)だけです。

したがって、属性が使用する名前空間を指定するだけで(""またはnullは両方とも"no namespace"に対して機能します)、状況はより適切に機能するはずです。

私の知る限り、JDKバージョンの問題は、属性が実際にデフォルトの名前空間を使用していると想定しているバージョンがあることです。そのため、偽の'xmlns=""'が追加されました。不要です。

于 2010-08-10T20:16:53.120 に答える