我开始使用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包含"
和&
,而不是"
和&
我究竟做错了什么?我应该使用正则表达式替换这些字符还是有更好的事情要做?
答案 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 XML和How can I disable unnecessary escaping in XStream? 。