我创建序列化的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
命名空间生成了除xml
之外的前缀。
如果不是因为重新解析文档时返回的错误,我觉得这很好。当我试图解析生成的文档时,我得到以下异常:
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
?
就在您告诉我使用包含prefix
参数的writeAttribute
方法之前,我正在对象之间引导SAX事件,而不想知道它们是什么。这就是为什么我希望整理器为我处理命名空间……这样我就不必为一个前缀是预先确定的给定命名空间编写特定的案例。考虑到xml
命名空间甚至不必定义(可能甚至不应该定义),写入IS_REPAIRING_NAMESPACES
代码库将是一个容易的例外,不是吗?
谢谢你的建议。
编写器只会"修复"未绑定到前缀的命名空间。添加
writer.setPrefix("xml", XMLConstants.XML_NS_URI);
在实际编写根元素之前解决问题。