Я создаю сериализованный 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
будет легким исключением, не так ли?
Спасибо за любые предложения.