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

簡潔な答え

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

}

出力

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

タグをエンコードしたくありません。この方法で出力が必要です。

次に、テキストノードはまったく必要ありませんcreateTextNode-それがあなたのために機能していない理由です。(むしろ、それはうまく機能しています-それはあなたが望むことをしていないだけです)。おそらく、XML文字列を解析してから、結果からドキュメントノードを新しいドキュメントにインポートする必要があります。

もちろん、要素を事前に知っている場合は、そもそも要素をテキストとして表現しないでください。 createElement、、、createAttributeを組み合わせcreateTextNodeappendChild構造を作成してください。

JDOMのようなものでこれが簡単になる可能性は十分にありますが、それが基本的なアプローチです。

于 2012-09-21T06:22:43.103 に答える
0

モハン、

Document.createTextNode() は使用できません。そのメソッドは、XML の文字を変換 (またはエスケープ) します。代わりに、2 つの XML から 2 つの個別のドキュメントを作成し、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

次に、インポートする Element/Node の 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 に答える