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

将xml转换为文本周围有CDATA的最佳方法(java)

  •  1
  • Dave  · 技术社区  · 17 年前

    似乎任何普通的XML库dom4j、jdom、JavaXML都没有对此的内置支持。有什么想法吗?我可以使用XSLT来实现这一点吗?

    <foo>This has an &amp; escaped value</foo>
    

    我需要做的是将其转换为:

    <foo><![CDATA[This has an & escaped value]]></foo>
    

    4 回复  |  直到 17 年前
        1
  •  4
  •   Robert Rossney    17 年前

    您可以使用XSLT来实现这一点,只要a)需要输出的所有文本都在元素中,b)您只关心文本节点,c)您知道包含文本的所有元素的名称,以及d)可以将所有这些输出元素中的任何文本作为CDATA发出。如果所有这些情况均为真,则可以编写标识转换并将此元素添加到其中:

    <xsl:output method="xml" cdata-section-elements="elm1 elm2 elm3..."/>
    

    看见 the W3C XSLT recommendation 关于这个问题。

        2
  •  3
  •   Dave    17 年前

    谢谢你的回答。我找到了一种使用dom4j实现这一点的方法。如果元素具有“混合”子元素(即文本元素),则我的实现不起作用,但在我的情况下,这不是问题。这是因为如果添加CDATA节点,dom4j将输出CDATA:

        public void replaceTextWithCdataNoMixedText(Document doc) {
            if( doc == null )
                return;
            replaceTextWithCdata(doc.content());
        }
    
        private void replaceTextWithCdata(List content) {
            if (content == null)
                return;
            for (Object o : content) {
                if (o instanceof Element) {
                    Element e = (Element) o;
                    String t = e.getTextTrim();
                    if (textNeedsEscaping(t)) {
                        e.clearContent();
                        e.addCDATA(t);
                    } else {
                        List childContent = e.content();
                        replaceTextWithCdata(childContent);
                    }
                }
            }
        }
    
    
        private boolean textNeedsEscaping(String t) {
            if (t == null)
                return false;
            for (int i = 0; i < t.length(); i++) {
                char c = t.charAt(i);
                if (c == '<' || c == '>' || c == '&') {
                    return true;
                }
            }
            return false;
        }
    
        3
  •  2
  •   Daniel H.    17 年前

    我认为它可以与XSLT转换一起工作,但我不确定转换的性能。看看 CDATA Sections and XSLT

        4
  •  0
  •   ewanm89    17 年前