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>