代码之家  ›  专栏  ›  技术社区  ›  paul

如何停止将属性中的&234;转换为&234;?

  •  7
  • paul  · 技术社区  · 14 年前

    我有下面的房间

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

    当我使用Java XMLSerialZiver序列化到一个文件时,它是这样产生的:

        <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 回复  |  直到 14 年前
        1
  •  2
  •   musiKk    14 年前

    如何获得DOM?会不会和这有关?我用SunJava6和最新的XELSCE-J(2.9-1)尝试了标准的Debug构建器(只是B/C,我更熟悉它)。顺便说一下,XMLSerialStor有利于LSiSerialor或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);
    
        2
  •  4
  •   Stephen C    14 年前

    问题是,您正在使用已经根据XML约定“转义”的属性值构建DOM。dom(当然)没有意识到您已经这样做了,并且正在逃离和号。

    你应该换一下

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

    root.setAttribute("test1", "\u00EA");
    

    换句话说,在构造DOM时使用由普通Unicode代码点组成的字符串。然后,XmlSerializer应使用字符实体替换Unicode字符。 按要求 …取决于为输出文档选择的字符编码。

    编辑 -您在输出XML中看到原始字符而不是字符实体的原因是,XML序列化程序正在使用XML的默认编码,即UTF-8。解决这个问题的方法是使用 XMLSerializer(OutputFormat) 构造函数,传递 OutputFormat 指定XML所需的字符编码。(听起来您使用的是“ascii”。)请确保使用兼容的字符编码 OutputStream .