Функция isRepairingNamespaces StaX генерирует префикс, отличный от «xml», для пространства имен XML.

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

Спасибо за любые предложения.


person user1293446    schedule 26.03.2012    source источник


Ответы (1)


Модуль записи будет «восстанавливать» только те пространства имен, которые не привязаны к префиксу. Добавление

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

до фактического написания корневого элемента устраняет проблему.

person chris    schedule 30.03.2012