StaX的isRepairingNamespaces功能生成一个不同于' xml'的前缀。用于XML命名空间

时间:2012-03-26 16:05:33

标签: 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);

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>

因此,修复命名空间功能为xml命名空间生成了http://www.w3.org/XML/1998/namespace以外的前缀。

如果不是因为重新解析文档时返回的错误,那对我来说没问题。当我尝试解析生成的文档时,我得到以下异常:

org.xml.sax.SAXParseException: The prefix "xml" cannot be bound to any namespace other than its usual namespace; neither can the namespace for "xml" be bound to any prefix other than "xml".

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

就在你告诉我使用包含writeAttribute参数的prefix方法之前,我在对象之间引导SAX事件而不想知道它们是什么。这就是为什么我希望marshaller为我处理命名空间的原因...所以我不必在特定情况下为一个给定命名空间编写前缀预先确定的命名空间。鉴于xml命名空间甚至不需要定义(甚至可能不应该这样),写入IS_REPAIRING_NAMESPACES代码库是一个简单的例外,不是吗?

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

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

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

在实际编写根元素之前修复了问题。