【问题标题】:XStream and underscoresXStream 和下划线
【发布时间】: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 理解单个下划线?

【问题讨论】:

    标签: java xml 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 分钟

    【讨论】:

      猜你喜欢
      • 2012-04-05
      • 2015-06-20
      • 1970-01-01
      • 2013-10-11
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      相关资源
      最近更新 更多