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

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

21 голосов
/ 17 февраля 2012

Похоже, что 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 ]

19 голосов
/ 04 июля 2012

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

XStream xs = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("_-", "_")));
12 голосов
/ 17 февраля 2012

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

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

4 голосов
/ 12 ноября 2013

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

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

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

3 голосов
/ 14 июля 2015

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

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