2010-06-18 2 views
1

Простая задача: написать элемент два атрибута:XMLOutputStream, ремонт пространств имен и атрибутов без пространств имен

String nsURI = "http://example.com/"; 
XMLOutputFactory outF = XMLOutputFactory.newFactory(); 
outF.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true); 
XMLStreamWriter out = outF.createXMLStreamWriter(System.out); 
out.writeStartElement(XMLConstants.DEFAULT_NS_PREFIX, "element", nsURI); 
out.writeAttribute("attribute", "value"); 
out.writeAttribute("attribute2", "value"); 
out.writeEndElement(); 
out.close(); 

ответ Woodstox в:

<element xmlns="http://example.com/" attribute="value" attribute2="value"></element> 

JDK 6 Ответ:

<zdef-1905523464:element xmlns="" xmlns:zdef-1905523464="http://example.com/" attribute="value" attribute2="value"></zdef-1905523464:element> 

Какие?! не

Далее, если мы добавим префикс к элементу:

out.writeStartElement("ns", "element", nsURI); 

JDK 6 больше не пытается излучать Xmlns = "":

<ns:element xmlns:ns="http://example.com/" attribute="value" attribute2="value"></ns:element> 

И если мы отбросим атрибут (т.е. только есть один), это прекрасно.

Я уверен, что это ошибка в JDK 6. Правильно ли я? И может ли кто-нибудь предложить работу, которая будет поддерживать обе библиотеки (и любые другие) счастливыми? Если я могу помочь, я не хочу требовать древесного покрова.

ответ

2

Я думаю, что вы должны сказать XMLStreamWriter что такое пространство имен по умолчанию, а затем использовать его при добавлении элементов:

String nsURI = "http://example.com/"; 
XMLOutputFactory outF = XMLOutputFactory.newFactory(); 
outF.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true); 
XMLStreamWriter out = outF.createXMLStreamWriter(System.out); 
out.setDefaultNamespace(nsURI); 
out.writeStartElement(nsURI, "element"); 
out.writeAttribute("attribute", "value"); 
out.writeAttribute("attribute2", "value"); 
out.writeEndElement(); 
out.close(); 

Приведенный выше код дает мне этот выход:

<element xmlns="http://example.com/" 
    attribute="value" attribute2="value"></element> 

с Java версии «1.6.0_20»

+0

Вы получили поврежденный выход раньше? Это не проблема для меня в 1.6.0_18. – user205512

+0

Или 1.6.0_20, который я только что скачал. – user205512

+0

да, я получаю сломанный выход, используя ваш исходный код – MarcoS

1

Мое предложение было бы никогда не полагаться на 2-аргументную версию writeAttribute(), поскольку определение того, что именно оно должно выводить, не ясно: sh ould использует пространство имен "" (или "нет пространства имен") или что-то вроде текущего пространства имен по умолчанию? Это особенно сбивает с толку, поскольку в соответствии со спецификацией XML атрибуты никогда не используют пространство имен по умолчанию (только явные). Таким образом, возможно, что все выраженные действия можно считать потенциально правильными; но, очевидно, они не могут быть такими. Это просто API-интерфейс Stax, который неправильно определяет (AFAIK), каков должен быть реальный ответ (который отстой).

Итак: просто укажите пространство имен, которое должен использовать атрибут ("" или null, оба работают для "без пространства имен"), и все должно работать лучше.

Проблема с версией JDK, насколько я знаю, заключается в том, что в некоторых версиях предполагается, что атрибуты фактически используют пространство имен по умолчанию; и поэтому этот фиктивный xmlns = "" "был добавлен. Это не нужно.

Смежные вопросы