Java StaX的isRepairingNamespaces功能为xml命名空间生成不同于“xml”的前缀

Java StaX的isRepairingNamespaces功能为xml命名空间生成不同于“xml”的前缀,java,serialization,marshalling,xml-namespaces,stax,Java,Serialization,Marshalling,Xml Namespaces,Stax,我创建序列化XML如下所示: XMLOutputFactory factory = XMLOutputFactory.newInstance(); factory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true); StringWriter buffer = new StringWriter(); XMLStreamWriter writer = factory.createXMLStreamWriter(buffer);

我创建序列化XML如下所示:

XMLOutputFactory factory = XMLOutputFactory.newInstance();
factory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true);

StringWriter buffer = new StringWriter();
XMLStreamWriter writer = factory.createXMLStreamWriter(buffer);

writer.writeStartElement("doc");
writer.writeAttribute(javax.xml.XMLConstants.XML_NS_URI, "base", "/mydoc.xml");
writer.writeCharacters("Hello world");
writer.writeEndDocument();
writer.close();

// buffer now contains:
// <doc xmlns:zdef101282835="http://www.w3.org/XML/1998/namespace" zdef101282835:base="/mydoc.xml">Hello world</doc>
因此,修复名称空间特性为http://www.w3.org/XML/1998/namespace 命名空间

如果不是因为在重新解析文档时返回的错误,我也可以这样做。当我尝试解析结果文档时,会出现以下异常:

org.xml.sax.SAXParseException:前缀xml不能绑定到其常用名称空间以外的任何名称空间;xml的命名空间也不能绑定到xml以外的任何前缀

有没有办法配置XMLOutputFactory来正确执行此操作

在您告诉我使用包含prefixparameter的writeAttribute方法之前,我正在对象之间传递SAX事件,而不想知道它们是什么。这就是为什么我希望marshaller为我处理名称空间。。。因此,我不必为前缀是预先确定的给定名称空间编写特定案例。考虑到xml名称空间甚至不必定义,而且可能也不应该这样定义,将其写入IS__名称空间代码库将是一个很容易的例外,不是吗


感谢您的建议。

编写器将只修复未绑定到前缀的名称空间。添加

writer.setPrefix("xml", XMLConstants.XML_NS_URI);

在实际写入根元素之前,将修复该问题。

写入程序将只修复未绑定到前缀的名称空间。添加

writer.setPrefix("xml", XMLConstants.XML_NS_URI);
在实际编写根元素之前,可以修复问题