【问题标题】:How to get JDK 8 default XML transformer to emit "'" for apostrophes如何让 JDK 8 默认 XML 转换器为撇号发出“'”
【发布时间】:2017-12-06 19:11:02
【问题描述】:

我有一个只能解析 XML 请求的第三方 Web 服务,其中属性中的撇号编码为 '。它拒绝像' 这样的原始撇号。此 Web 服务不关心您的论点,即 XML 标准允许在由双引号分隔的属性值中使用撇号。它想要'

我想使用标准 Java XML 转换器为这些请求生成 XML。它不会将' 编码为'。我怎样才能做到这一点?

示例程序:

class test {
    public static void main(String args[]) throws Exception {
        final org.w3c.dom.Document doc = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
        final org.w3c.dom.Element tag = doc.createElement("fedora");
        tag.setAttribute("tip", "m'lady");
        doc.appendChild(tag);
        doc.setXmlStandalone(true);
        final javax.xml.transform.Transformer t = javax.xml.transform.TransformerFactory.newInstance().newTransformer();
        t.setOutputProperty(javax.xml.transform.OutputKeys.VERSION, "1.0");
        t.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, "UTF-8");
        t.setOutputProperty(javax.xml.transform.OutputKeys.STANDALONE, "yes");
        t.transform(new javax.xml.transform.dom.DOMSource(doc),
                    new javax.xml.transform.stream.StreamResult(new java.io.PrintWriter(System.out)));
    }
}

它发出什么:<?xml version="1.0" encoding="UTF-8" standalone="no"?><fedora tip="m'lady"/>

我希望它发出什么:<?xml version="1.0" encoding="UTF-8" standalone="no"?><fedora tip="m'lady"/>

【问题讨论】:

  • 一般来说,XSLT 和 JAXP 中的序列化工具的设计假设输出将由符合标准的 XML 解析器使用。一旦您的系统中有不符合标准的组件,您的成本就会大大增加,因为其他现成的组件变得无法使用。

标签: java xml entity


【解决方案1】:

XSLT 2.0 解决方案

在 XSLT 2.0+ 中,您可以使用 character maps:

<xsl:character-map name="aposCharMap">
  <xsl:output-character character="'" string="&amp;apos;"/>
</xsl:character-map>

这将在序列化期间用&amp;apos; 替换'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-15
    • 2021-03-22
    • 1970-01-01
    • 2023-01-10
    • 2014-08-19
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    相关资源
    最近更新 更多