我有以下DOM
<row>
<link href="Büro.txt" target="_blank">
my link
</link>
</row>
当我使用Java XmlSerializer将其序列化为文件时,它会出现如下:
<row>
<link href="B&#252;ro.txt" target="_blank">
my link
</link>
</row>
有没有办法控制XmlSerializer处理属性转义的方式?我应该以任何方式做到这一点吗?
更新
我还应该说我使用的是jre 1.6。直到最近我一直在使用jre 1.5,我很确定它是'正确'序列化(即'&amp;'没有被转义)
澄清
DOM是以编程方式创建的。这是一个例子:
Document doc = createDocument();
Element root = doc.createElement("root");
doc.appendChild(root);
root.setAttribute("test1", "ê");
root.setAttribute("test2", "üöä");
root.appendChild(doc.createTextNode("ê"));
StringWriter sw = new StringWriter();
serializeDocument(doc, sw);
System.out.println(sw.toString());
我的解决方案
我真的不想这样做,因为它涉及相当多的代码更改和测试,但我决定将属性数据移动到CDATA元素中。问题已解决避免。
答案 0 :(得分:4)
问题是您正在使用已根据XML约定“转义”的属性值构建DOM。 DOM(当然)没有意识到你已经完成了这个并且正在逃避&符号。
你应该改变
root.setAttribute("test1", "ê");
到
root.setAttribute("test1", "\u00EA");
换句话说,在构造DOM时使用由纯Unicode代码点组成的字符串。然后,XMLSerializer应将Unicode字符替换为字符实体,如果需要 ...,具体取决于输出文档的所选字符编码。
编辑 - 您可能仍然在输出XML中看到原始字符而不是字符实体的原因是XMLSerializer正在使用XML的默认编码;即UTF-8。解决此问题的方法是使用XMLSerializer(OutputFormat)
构造函数,传递OutputFormat
,指定XML所需的字符编码。 (听起来你使用的是“ASCII”。)请务必使用兼容OutputStream
的字符编码。
答案 1 :(得分:2)
你如何获得DOM?它可能与此有关吗?我使用Sun Java 6和最新的Xerces-J(2.9.1)尝试使用标准DocumentBuilder(只是b / c我更熟悉它)的示例XML,顺便说一下,XmlSerializer弃用了LSSerializer或TrAX。
无论如何,使用这种技术,序列化文档甚至不再包含字符引用,并转换为“Büro.txt”。我使用了以下代码:
String xml = "<row>\n"
+ " <link href=\"Büro.txt\" target=\"_blank\">\n"
+ " my link\n" + " </link>\n" + " </row>";
InputStream is = new ByteArrayInputStream(xml.getBytes());
Document doc = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().parse(is);
XMLSerializer xs = new XMLSerializer();
xs.setOutputCharStream(new PrintWriter(System.err));
xs.serialize(doc);