java - 如何避免使用 Document.createTextNode 对 <、>、& 进行编码

标签 java xml

class XMLencode 
{
  public static void main(String[] args) 
  {
    try{

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = factory.newDocumentBuilder();
    Document doc = docBuilder.newDocument();
    Element root = doc.createElement("roseindia");
       doc.appendChild(root);
    Text elmnt=doc.createTextNode("<data>sun</data><abcdefg/><end/>");
       root.appendChild(elmnt);
     TransformerFactory tranFactory = TransformerFactory.newInstance(); 
    Transformer aTransformer = tranFactory.newTransformer(); 
    Source src = new DOMSource(doc); 
    Result dest = new StreamResult(System.out); 
    aTransformer.transform(src, dest); 

    }catch(Exception e){
     System.out.println(e.getMessage());
         }
     }
}

这是我上面的一段代码。 生成的输出是这样的

<?xml version="1.0" encoding="UTF-8" standalone="no"?><roseindia>&lt;data&gt;sun&lt;/data&gt;&lt;abcdefg/&gt;&lt;end/&gt;</roseindia>

我不想对标签进行编码。我需要这种方式的输出。

<?xml version="1.0" encoding="UTF-8" standalone="no"?><roseindia><data>sun</data><abcdefg/><end/></roseindia>

请帮我解决这个问题。

谢谢, 磨憨

最佳答案

简答题

您可以利用 XML 中的 CDATA 机制来防止字符被转义。下面是 DOM 代码的示例:

doc.createCDATASection("<foo/>");

内容将是:

<![CDATA[<foo/>]]>

长答案

下面是一个使用 DOM API 来利用 CDATA 部分的完整示例。

package forum12525152;

import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document document = db.newDocument();

        Element rootElement = document.createElement("root");
        document.appendChild(rootElement);

        // Create Element with a Text Node
        Element fooElement = document.createElement("foo");
        fooElement.setTextContent("<foo/>");
        rootElement.appendChild(fooElement);

        // Create Element with a CDATA Section
        Element barElement = document.createElement("bar");
        CDATASection cdata = document.createCDATASection("<bar/>");
        barElement.appendChild(cdata);
        rootElement.appendChild(barElement);

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer();
        DOMSource source = new DOMSource(document);
        StreamResult result = new StreamResult(System.out);
        t.transform(source, result);
    }

}

输出

请注意 foobar 元素的区别,尽管它们具有相似的内容。我对运行演示代码的结果进行了格式化以使其更具可读性:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <foo>&lt;foo/&gt;</foo>
    <bar><![CDATA[<bar/>]]></bar>
</root>

关于java - 如何避免使用 Document.createTextNode 对 <、>、& 进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12525152/

相关文章:

android - 实现 HTML 书状分页

Java 递归泛型和通配符

java - 有没有办法使用 jdk.internal.access.SharedSecrets 从 java.util 包访问包私有(private) String.isLatin1() ?

java - 通过 id 查找布局

java - 如何将单个单词转换为有效的 xml?

python - "instance has no attribute ' iter '"无法从命令行工作

php - 我可以在不自动转义 $url 的情况下使用 simplexml_load_file($url) 吗?

java - 相同的代码在不同的 Activity 中不起作用

java - 将数据从主方法导入到另一个方法中,然后在再次运行程序之前存储该值

java - 如何使用Math.pow查找整数数组的几何平均值