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 понятным одно подчеркивание?
Ответы
Ответ 1
XStream использует знак подчеркивания для escape-символов в идентификаторах, которые действительны на Java, но недействительны в XML (см. здесь). Поэтому нужно подчеркнуть подчеркивание. Вы можете использовать пользовательский NameCoder
, как описано в FAQ.
Это говорит, что я обычно могу ладить с NoNameCoder
. Но: Не используйте символы подчеркивания в идентификаторах Java-свойств, если это возможно; это нетипично для Java и для Соглашения о присвоении имен Java.
Ответ 2
Это сработало для меня:
XStream xs = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("_-", "_")));
Ответ 3
Я использовал:
XmlFriendlyNameCoder nameCoder = new XmlFriendlyNameCoder("ddd", "_");
XStream xmlStream = new XStream(new Dom4JDriver(nameCoder));
и он отлично поработает!
Я использую x-stream версии 1.4.5.
Надеюсь, это поможет!
Ответ 4
Работал для меня:
XStream xstream = new XStream(new DomDriver("UTF_8", new NoNameCoder()));