7

我有以下 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,我很确定它被“正确”序列化(即“&”没有被转义)

澄清

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 元素中。问题解决避免。

4

2 回答 2

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

于 2010-06-14T06:35:52.450 回答
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);
于 2010-06-09T08:14:38.530 回答