如何避免编码<,>,&使用Document.createTextNode

时间:2012-09-21 06:11:13

标签: 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>

请帮我解决这个问题。

谢谢, 莫汉

6 个答案:

答案 0 :(得分:5)

简答

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

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

内容将是:

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

LONG ANSWER

以下是使用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>

答案 1 :(得分:3)

而不是像这样写doc.createTextNode("<data>sun</data><abcdefg/><end/>");

您应该创建每个元素。

import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.w3c.dom.*;
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);

            Element data = doc.createElement("data");
            root.appendChild(data);
            Text elemnt = doc.createTextNode("sun");
            data.appendChild(elemnt);
            Element data1 = doc.createElement("abcdefg");
            root.appendChild(data1);

            //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());
        }
    }
}

答案 2 :(得分:2)

您可以使用doc.createTextNode并对转义字符使用变通方法(长整数)。

SOAPMessage msg = messageContext.getMessage();

header.setTextContent(seched);

然后使用

Source src = msg.getSOAPPart().getContent();

要获取内容,请将其转换为字符串

TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.  setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
StreamResult result1 = new StreamResult(new StringWriter());
transformer.transform(src, result1);

替换字符串特殊字符

String xmlString = result1.getWriter().toString()
.replaceAll("&lt;", "<").
replaceAll("&gt;", ">");
System.out.print(xmlString);

带有固定转义字符的oposite字符串

DocumentBuilder db =  DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xmlString));
Document doc = db.parse(is);
Source src123 = new DOMSource(doc);

然后将其设置回soap消息    msg.getSOAPPart().setContent(src123);

答案 3 :(得分:0)

不要使用createTextNode - 它的全部内容是将一些文本(作为数据)插入到文档中,而不是原始XML的片段。

对文本使用createTextNode,为元素使用createElement

答案 4 :(得分:0)

  

我不希望标签被编码。我需要这种方式输出。

然后你根本不想想要一个文本节点 - 这就是createTextNode不适合你的原因。 (或者说,它工作正常 - 它只是没有做你想要的)。您应该只解析XML字符串,然后将结果中的文档节点导入到新文档中。

当然,如果您事先知道这些元素,请不要将它们首先表达为文本 - 使用createElementcreateAttributecreateTextNode和{{1创建结构。

JDOM这样的东西完全有可能使这更简单,但这是基本方法。

答案 5 :(得分:0)

Mohan将

您不能使用Document.createTextNode()。该方法转换(或转义)XML中的特征。 相反,您需要从2个XML构建两个单独的文档,并使用 importNode

我像这样使用Document.importNode()来解决我的问题:

建立你的建设者:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder();
Document oldDoc = builder.parse(isOrigXml); //this is XML as InputSource
Document newDoc = builder.parse(isInsertXml); //this is XML as InputSource

接下来,构建要导入的元素/节点的NodeList。从NodeList创建节点。使用importNode创建要导入的内容的另一个节点。构建最终XML的最后一个节点:

NodeList nl = newDoc.getElementByTagName("roseindia"); //or whatever the element name is
Node xmlToInsert = nl.item(0);
Node importNode = oldDoc.importNode(xmlToImport, true);
Node target = ((NodeList) oldDoc.getElementsByTagName("ELEMENT_NAME_OF_LOCATION")).item(0);
target.appendChild(importNode);

Source source = new DOMSource(target);
....

其余的是标准的Transformer - StringWriter到StreamResult的东西来获得结果。