Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XMLOutputStream,修复名称空间和没有名称空间的属性_Java_Xml_Namespaces_Xml Namespaces_Stax - Fatal编程技术网

Java XMLOutputStream,修复名称空间和没有名称空间的属性

Java XMLOutputStream,修复名称空间和没有名称空间的属性,java,xml,namespaces,xml-namespaces,stax,Java,Xml,Namespaces,Xml Namespaces,Stax,一个简单的任务:为元素编写两个属性: String nsURI = "http://example.com/"; XMLOutputFactory outF = XMLOutputFactory.newFactory(); outF.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true); XMLStreamWriter out = outF.createXMLStreamWriter(System.out); out.writeS

一个简单的任务:为元素编写两个属性:

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不再尝试发出xmlns=“”:


如果我们删除了一个属性(即只有一个属性),就可以了


我相当肯定这是JDK6中的一个bug。我说得对吗?还有谁能提出一个能让两个图书馆(以及其他图书馆)都感到高兴的工作方案?如果可以的话,我不想要求woodstox。

我认为您必须告诉
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”

我的建议是永远不要依赖writeAttribute()的2参数版本,因为它应该输出什么的定义并不清楚:它应该使用名称空间“”(也称为“无名称空间”)还是当前的默认名称空间?这尤其令人困惑,因为根据XML规范,属性从不使用默认名称空间(仅显式名称空间)。因此,可以说,所有表达的行为都可能被视为是正确的;但显然,它们不可能都是。只是STAXAPI没有正确定义(AFAIK)真正的答案应该是什么(这很糟糕)

所以:只需指定属性应该使用的名称空间(“no namespace”或null)就可以了,这样会更好


据我所知,JDK版本的问题在于,一些版本假设属性实际上使用了默认名称空间;这就是为什么添加了假“xmlns=”“”的原因。这是不必要的。

您以前收到过损坏的输出吗?这并不能解决我刚下载的1.6.0_18或1.6.0_20中的问题。啊,更正。您的代码确实可以工作,但造成差异的不仅仅是默认名称空间,而是使用WriteStarteElement(nsURI,localname)而不是WriteStarteElement(“,localname,nsURI)。谢谢哦,是的,对不起,也许我的回答不是很清楚,但这就是我的意思。
<ns:element xmlns:ns="http://example.com/" attribute="value" attribute2="value"></ns:element>
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>