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

How to avoid Xstream to produce xml file with &amp or &quote or similar chars?

我开始与 Xstream 和 Java 一起工作。
我有一个名为 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 而不是 "&
我究竟做错了什么?我应该使用正则表达式来替换这些字符还是有更好的办法?

我发现这个问题很有趣,所以我做了一些调查。

XStream 不会自己写 XML,它使用各种库("drivers"?)来写。因此,在使用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 '[=10=]':
                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 没有转义 。我尝试了一个给定的解决方案: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 XML 如何禁用 XStream 中不必要的转义? .