XStream和下划线

eig*_*gil 21 java xml 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;
}
Run Code Online (Sandbox Code Playgroud)

这输出

INFO: <C1 a__b="a_b"/>
INFO: a_b
INFO: null
Run Code Online (Sandbox Code Playgroud)

现在我的问题 - 有没有办法让XStream理解一个下划线?

Jam*_*ung 19

这对我有用:

XStream xs = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("_-", "_")));
Run Code Online (Sandbox Code Playgroud)


Hau*_*idt 12

XStream使用下划线来转义在Java中有效但在XML中无效的标识符中的字符(请参阅此处).所以下划线本身必须被转义.您可以使用NameCoder常见问题解答中描述的自定义.

那说我通常可以相处NoNameCoder.但是:如果可能的话,不要在Java属性标识符中使用下划线; 它对于Java和Java命名约定来说是不典型的.


小智 5

我用了:

XmlFriendlyNameCoder nameCoder = new XmlFriendlyNameCoder("ddd", "_");  
XStream xmlStream = new XStream(new Dom4JDriver(nameCoder)); 
Run Code Online (Sandbox Code Playgroud)

而且效果很好!我正在使用x-stream版本1.4.5。希望能帮助到你!