2012-02-17 3 views
20

Похоже, что XStream (com.thoughtworks.xstream -> xstream 1.4.2) обрабатывает символы подчеркивания в именах элементов и атрибутов очень странным образом. Мне нужно получить и проанализировать xml от клиента, у которого есть подчеркивания в их атрибутах. Это моя первая попытка с XStream, и я немного разочарован, поскольку я надеялся избежать всего уродливого разбора XML.XStream и символы подчеркивания

Здесь я предоставляю небольшой образец для проверки поведения. Последний пример показывает мою проблему.

public class MyTest { 
    public void testIt() { 
    C1 a = new C1(); 
    a.a_b= "a_b"; 

    XStream xstream = new XStream(); 
    xstream.processAnnotations(C1.class); 

    String xml = xstream.toXML(a); 
    Logger.info(xml); 

    C1 b = (C1) xstream.fromXML(xml); 
    Logger.info(b.a_b); 

    C1 c = (C1) xstream.fromXML("<C1 a_b=\"a_b\"/>"); 
    Logger.info(c.a_b); 
    } 
} 

@XStreamAlias("C1") 
class C1 { 
@XStreamAsAttribute 
String a_b; 
} 

Это выводит

INFO: <C1 a__b="a_b"/> 
INFO: a_b 
INFO: null 

Теперь мой вопрос - есть ли способ сделать XStream понять один подчеркивание?

ответ

12

XStream использует символ подчеркивания для пропуска символов в идентификаторах, которые действительны на Java, но недействительны в XML (см. here). Поэтому нужно подчеркнуть подчеркивание. Вы можете использовать пользовательский NameCoder, как описано в FAQ.

Сказали, что я обычно могу ладить с NoNameCoder. Но: Не используйте символы подчеркивания в идентификаторах Java-свойств, если это возможно; это нетипично для Java и против Java Naming Conventions.

+0

Спасибо очень много. XStream (новый StaxDriver (новый NoNameCoder())) не работал, поэтому я буду исследовать создание пользовательского. – eigil

+0

NoNameCoder действительно работает. Я просто забыл добавить @XStreamAlias ​​(«a_b») к переменной, когда я изменил ее на ab на основе вашего предложения о соглашениях об именах java. – eigil

18

Это работает для меня:

XStream xs = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("_-", "_"))); 
+0

XmlFriendlyReplacer() работает тоже. – kitokid

+0

Работал для меня. XmlFriendlyReplacer() лишен. –

+0

Awesome. Отлично. –

3

Я использовал:

XmlFriendlyNameCoder nameCoder = new XmlFriendlyNameCoder("ddd", "_"); 
XStream xmlStream = new XStream(new Dom4JDriver(nameCoder)); 

и он работал отлично! Я использую x-stream версию 1.4.5. Надеюсь, это поможет!

2

Работал для меня:

XStream xstream = new XStream(new DomDriver("UTF_8", new NoNameCoder())); 
+0

работает с 1.4.7 только с '' UTF8 "' вместо '' UTF_8 "' – Vertex