XStream和下划线

时间:2012-02-17 17:53:06

标签: 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;
}

此输出

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

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

5 个答案:

答案 0 :(得分:19)

这对我有用:

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

答案 1 :(得分:12)

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

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

答案 2 :(得分:4)

我用过:

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

它很棒! 我正在使用x-stream版本1.4.5。 希望它有所帮助!

答案 3 :(得分:3)

为我工作:

$this->Model->find(
        'all',
        array(
            'order' => array('Model.fieldname DESC');
            'group' => array('Model.fieldname');
        )
    );

答案 4 :(得分:0)

我用了这个

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

它起作用了,但是将执行时间/解析时间增加到4-5分钟