看起来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理解一个下划线?
答案 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分钟