XStream 和下划线
Posted
技术标签:
【中文标题】XStream 和下划线【英文标题】:XStream and underscores 【发布时间】:2012-03-09 03:14:46 【问题描述】:看起来 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 使用下划线来转义标识符中的字符,这些字符在 Java 中有效但在 XML 中无效(请参阅here)。所以下划线本身必须被转义。您可以按照常见问题解答中的说明使用自定义 NameCoder
。
也就是说我通常可以和NoNameCoder
相处。但是:如果可能,不要在 Java 属性标识符中使用下划线;这对于 Java 和 Java Naming Conventions 来说是不典型的。
【讨论】:
非常感谢。 XStream(new StaxDriver(new NoNameCoder())) 不起作用,所以我将研究制作一个自定义的。 NoNameCoder 确实有效。根据您对 java 命名约定的建议,当我将其更改为 ab 时,我只是忘记将 @XStreamAlias("a_b") 添加到变量中。【参考方案2】:这对我有用:
XStream xs = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("_-", "_")));
【讨论】:
为我工作。 XmlFriendlyReplacer() 已弃用。 太棒了。效果很好。 谢谢它真的很有帮助【参考方案3】:我用过:
XmlFriendlyNameCoder nameCoder = new XmlFriendlyNameCoder("ddd", "_");
XStream xmlStream = new XStream(new Dom4JDriver(nameCoder));
而且效果很好! 我正在使用 x-stream 版本 1.4.5。 希望对您有所帮助!
【讨论】:
XStream xs=new XStream (new Dom4JDriver (new NoNameCoder()));
适用于 1.4.4【参考方案4】:
为我工作:
XStream xstream = new XStream(new DomDriver("UTF_8", new NoNameCoder()));
【讨论】:
只能在 1.4.7 上使用"UTF8"
而不是 "UTF_8"
【参考方案5】:
我用过这个
XStream xstream = new XStream(new DomDriver("UTF_8", new NoNameCoder()));
它有效,但它将执行时间/解析时间增加到 4-5 分钟
【讨论】:
以上是关于XStream 和下划线的主要内容,如果未能解决你的问题,请参考以下文章