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><data>sun</data><abcdefg/><end/></roseindia>
我不希望标签被编码。我需要这种方式输出。
<?xml version="1.0" encoding="UTF-8" standalone="no"?><roseindia><data>sun</data><abcdefg/><end/></roseindia>
请帮我解决这个问题。
谢谢, 莫汉
答案 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);
}
}
的输出强> 的
注意foo
和bar
元素的差异,即使它们具有相似的内容。我已经格式化了运行演示代码的结果,使其更具可读性:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
<foo><foo/></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("<", "<").
replaceAll(">", ">");
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字符串,然后将结果中的文档节点导入到新文档中。
当然,如果您事先知道这些元素,请不要将它们首先表达为文本 - 使用createElement
,createAttribute
,createTextNode
和{{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的东西来获得结果。