如何避免 Xstream 生成带有 & 或 "e 或类似字符的 xml 文件?
How to avoid Xstream to produce xml file with & or "e 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 包含 "
和 &
而不是 "
和 &
。
我究竟做错了什么?我应该使用正则表达式来替换这些字符还是有更好的办法?
我发现这个问题很有趣,所以我做了一些调查。
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 中不必要的转义?
.
我开始与 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 包含 "
和 &
而不是 "
和 &
。
我究竟做错了什么?我应该使用正则表达式来替换这些字符还是有更好的办法?
我发现这个问题很有趣,所以我做了一些调查。
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 中不必要的转义? .