5
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>

请帮助我。

谢谢,莫汉

4

6 回答 6

7

简答

您可以利用CDATAXML 中的机制来防止字符被转义。下面是一个 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);
    }

}

输出

foo请注意和元素的差异,bar即使它们具有相似的内容。我已经对运行演示代码的结果进行了格式化,以使其更具可读性:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <foo>&lt;foo/&gt;</foo>
    <bar><![CDATA[<bar/>]]></bar>
</root>
于 2012-09-21T12:12:36.760 回答
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());
        }
    }
}
于 2012-09-21T06:26:40.903 回答
1

您可以使用 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);

带有固定转义字符的 dom 的相反字符串

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

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

于 2016-05-14T14:29:08.210 回答
0

莫汉,

您不能使用 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 的东西来获得结果。

于 2013-01-31T23:55:37.970 回答
0

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

createTextNode对文本和createElement元素使用组合。

于 2012-09-21T06:21:04.790 回答
0

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

那么你根本不需要文本节点 - 这就是为什么createTextNode不适合你。(或者更确切地说,它工作正常 - 它只是没有做你想做的事)。您可能应该只解析您的 XML 字符串,然后将结果中的文档节点导入到您的新文档中。

当然,如果您事先知道元素,首先不要将它们表达为文本 - 使用 、 和 的混合createElementcreateAttribute创建createTextNode结构appendChild

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

于 2012-09-21T06:22:43.103 回答