如何阻止XmlSerializer将ê转换为ê在一个属性?

时间:2010-06-09 05:39:47

标签: java attributes escaping xmlserializer

我有以下DOM

    <row>
        <link href="B&#252;ro.txt" target="_blank">
            my link
        </link>
    </row>

当我使用Java XmlSerializer将其序列化为文件时,它会出现如下:

    <row>
        <link href="B&amp;#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", "&#234;");
        root.setAttribute("test2", "üöä");
        root.appendChild(doc.createTextNode("&#234;"));

        StringWriter sw = new StringWriter();

        serializeDocument(doc, sw);
        System.out.println(sw.toString());

我的解决方案 我真的不想这样做,因为它涉及相当多的代码更改和测试,但我决定将属性数据移动到CDATA元素中。问题已解决避免。

2 个答案:

答案 0 :(得分:4)

问题是您正在使用已根据XML约定“转义”的属性值构建DOM。 DOM(当然)没有意识到你已经完成了这个并且正在逃避&符号。

你应该改变

root.setAttribute("test1", "&#234;");

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&#252;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);