Функция StaX isRepairingNamespaces генерирует префикс, отличный от 'xml' для пространства имен XML - PullRequest
2 голосов
/ 26 марта 2012

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

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

1 Ответ

0 голосов
/ 30 марта 2012

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

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

перед фактической записью корневого элемента решает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...