XStream и подчеркивание

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

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

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 понимать единственное подчеркивание?

4 ответа

Решение

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

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

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

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

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

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

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

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

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

Я использовал это

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

Это сработало, но увеличивает время обработки / синтаксического анализа до 4-5 минут

Другие вопросы по тегам