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

标签 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 包含 "& 而不是 "&
我究竟做错了什么?我应该使用正则表达式来替换这些字符还是有更好的办法?

最佳答案

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

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 中。本身,但在 XMLStreamWriter用来写一个xml文件。我找到了 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? .

关于java - 如何避免 Xstream 生成带有 &amp 或 &quote 或类似字符的 xml 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48141168/

相关文章:

java - react 堆,无法加载类 "org.slf4j.impl.StaticLoggerBinder"

java - JAXB 创建空对象

java - Eclipse Luna,Google Web Kit - 创建 GWT RemoteService

java - 如何在Java中反序列化xml文件中的电子邮件列表?

java - XStream 无法在反序列化为 java 时为字段名添加别名

java - c++ 可以做这个 java 构建器模式吗?

java - 如何通过 Java 代码中的 SpEL 表达式选择 Tomcat context.xml 参数

c# - Linq 从未在 XDocument 中找到元素

xml - 是否可以使用 xs :union for complexTypes?

java - XStream 或简单