Я создаю сериализованный 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 между объектами, не желая знать, что они есть.Именно поэтому я хочу, чтобы маршаллер обрабатывал пространства имен для меня ... поэтому мне не нужно писать в конкретном случае одно заданное пространство имен, префикс которого предопределен.Учитывая, что пространство имен xml
даже не нужно определять (и, вероятно, не должно быть таковым), было бы простым исключением записать в кодовую базу IS_REPAIRING_NAMESPACES
, не так ли?
Спасибо за любые предложения.