如何避免Xstream生成带有&的xml文件或“e或类似的字符?

时间:2018-01-07 20:18:25

标签: java xml xstream

我开始使用Java Xstream 我有一个名为CarList的汽车列表 我有一辆汽车作为名为Car的对象。

XStream xstream = new XStream(new StaxDriver());
xstream.alias("Car", Car.class);
xstream.alias("Cars", CarList.class);
xstream.addImplicitCollection(CarList.class, "list");
xstream.toXML(list, new FileWriter(fileName+xmlExtension));

不幸的是每次我保存文件。我的XML包含&quot&amp,而不是"& 我究竟做错了什么?我应该使用正则表达式替换这些字符还是有更好的事情要做?

1 个答案:

答案 0 :(得分:1)

我发现这个问题很有趣,所以我对此进行了一些调查。

XStream不会自己编写XML,它使用各种库("驱动程序"?)来执行此操作。因此,可以在使用HierarchicalStreamDriver的具体实现中找到原因。

首先,我尝试使用XStream xstream = new XStream()进行调试。在这种情况下,您可以看到switch操作符来编写这些替换项(请参阅PrettyPrintWriter.writeText()):

private void writeText(String text) {
    int length = text.length();
    for (int i = 0; i < length; i++) {
        char c = text.charAt(i);
        switch (c) {
            case '\0':
                this.writer.write(NULL);
                break;
            case '&':
                this.writer.write(AMP);
                break;
            case '<':
                this.writer.write(LT);
                break;
            case '>':
                this.writer.write(GT);
                break;
            case '"':
                this.writer.write(QUOT);
                break;
            case '\'':
                this.writer.write(APOS);
                break;
            case '\r':
                this.writer.write(SLASH_R);
                break;
            default:
                this.writer.write(c);
        }
    }
}

其次,我使用XStream xstream = new XStream(driver)的示例尝试了这一点。有可用来源的最终调试点(我没有深入)是StaxWriter.setValue()。这意味着,原因不在于XStream本身,而在用于编写xml文件的XMLStreamWriter中。我找到了XMLStreamWriter writeCharacters without escaping 。我尝试过一个给定的解决方案:streamWriterFactory.setProperty("escapeCharacters", false);我目前的解决方案是:

StaxDriver driver = new StaxDriver();
driver.getOutputFactory().setProperty("escapeCharacters", false);
XStream xstream = new XStream(driver);

我已修复了替换"&的问题。但问题是如果你有例如其中一个字符串中的<> - 也不会更改,并且会破坏最终的xml。

所以,我不知道你的背景,可能这个简单的解决方案对你来说已经足够了。如果没有,并且您输出了<>符号,那么我会找到一个驱动程序读取 escapeCharacters 属性的位置,并找出如何仅禁用特定的转义字符集。

我不知道有没有标准方式,对不起。但似乎我发现的所有结果都不是普遍的,要解决这个问题,我们必须知道任务背景。正如您所提到的,其中一个不错的解决方案就是在最终的xml中替换必需的转义符号:XStream apostrophe Issue in converting Java Object to XMLHow can I disable unnecessary escaping in XStream?