我开始使用 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 XML和 How can I disable unnecessary escaping in XStream? .
关于java - 如何避免 Xstream 生成带有 & 或 "e 或类似字符的 xml 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48141168/