JAXPでDOMを保存する際、'&'を'&'に展開したくない

このQ&Aのポイント
  • JAXPでXMLを扱う際、DOMオブジェクトを保存するときに実態参照を作れない問題があります。方法を教えてください。
  • 実態参照について、間違いや知らなければならないことがあるのか教えてください。
  • DOMの状態では挿入した実態参照がそのまま参照できることが望ましいですが、保存すると'&'が'&'に展開されます。解決策を教えてください。
回答を見る
  • ベストアンサー

JAXPでDOMを保存する際、'&'を'&'に展開したくない

当方JAXPでXMLを扱っています。 今悩んでいることなのですが、DOMオブジェクトを保存しようとすると、実態参照をつくることができません。 何かよい方法はありませんか? また、実態参照について、私のほうに根本的な間違いや知らなければならないことがあるのでしょうか。 よろしくお願いします。 ----------サンプルソース------------ DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = builder.newDocument(); Element root = document.createElement("root"); // 実態参照を挿入 root.appendChild(document.createTextNode("&nbsp;")); document.appendChild(root); // DOMの状態では挿入したものがそのまま参照できる System.out.println("on dom : " + root.getTextContent()); // 保存 Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(System.out)); --------------結果----------------- on dom : &nbsp; <?xml version="1.0" encoding="UTF-8" standalone="no"?><root>&amp;nbsp;</root> --------------望む結果-------------- on dom : &nbsp; <?xml version="1.0" encoding="UTF-8" standalone="no"?><root>&nbsp;</root> --------------------------------------

  • ggaogg
  • お礼率86% (209/243)
  • Java
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2
ggaogg
質問者

お礼

リンク先に記述してあるように、processing-instructionをうまく利用すると、今回の私の目的は達成できるようです。 一応は解決ということで、締め切らせて頂きました。 ありがとうございました。

その他の回答 (1)

回答No.1

やあ、また会ったね。 回答しつつも,当方のJava 1.7.0-b23でまだうまくいってないんだ。 document.createTextNode じゃなくて document.createEntityReference を使うんだと思う・・・んだけど・・・何故か以下のソースを実行すると ============================ import org.w3c.dom.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; class Q3560141A{ public static void main(String[] args){ try{ DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = builder.newDocument(); Element root = document.createElement("root"); // 実体参照を挿入 root.appendChild(document.createEntityReference("gt")); document.appendChild(root); // DOMの状態では挿入したものがそのまま参照できる System.out.println("on dom : " + root.getTextContent()); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(System.out)); }catch(ParserConfigurationException ex){ System.out.println(ex.getStackTrace()); }catch(TransformerException ex){ System.out.println(ex.getStackTrace()); } } } ===================== on dom : <?xml version="1.0" encoding="UTF-8" standalone="no"?><root/> となってしまうんだ。ヒントになればと思って一応アドバイスしておくよ。 ちなみに質問文と違って, on dom : &nbsp; <?xml version="1.0" encoding="UTF-8" standalone="no"?><root>&nbsp;</root> ではなく on dom:> <?xml version="1.0" encoding="UTF-8" standalone="no"?><root>&gt;</root> を望んでいるつもりだ。 on domが&gt;でない点に注意! あと ×実態参照 ○実体参照  ね

ggaogg
質問者

お礼

いつもありがとうございますー。 え、Javaついに1.7でたんですか! 早速調べなきゃ! document#createEntityReference は、試してみたんですけれど、himajin10万さんの結果のように、なぜか無視されるので、それが答えなのかどうかがわかりませんでした。 「on dom」で出力しているところからわかるように、きっとTransformer通すときに実体参照にもどせてないのが原因みたいなんですが・・。 あと試してみたことといえば、 DocumentBuilderFactory#isExpandEntityReferences(false) 初期値がtrueだそうで、名前からするに、実体を展開するかどうかの設定みたいなので、falseにすれば展開されずにそのまま残るんじゃないなかと思いまして・・。結果は何も変わらなかったように見えました。パースするときしか意味がないのかな?? >×実態参照 >○実体参照  ありがとうございます。 もしかしたら正しい文字列で検索すれば、もっと有益な情報が検索できるようになるかもしれません。

関連するQ&A

  • DOMツリーの作り方。

    XMLのDOMツリーをjavaで作りたいです。 ---Root.xmlファイル--- <?xml version="1.0!> <root></root> ------ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document root = builder.parse("c:/tmp/Root.xml"); /*rootの子ノードとして新しいノード(title)を追加していく*/ といったやり方があると思うんですが、 そうではなく、プログラム内でrootドキュメントを作ってtitle子ノードを追加していきたいんです。 つまり、Root.xmlに頼りたくないということなんですが、どうしたらよいでしょうか?

    • 締切済み
    • XML
  • 現在、JAVAのXML/DOMを利用して

    現在、JAVAのXML/DOMを利用して XMLを生成してタグ、インデントを含めそのまま WEBブラウザに出力するようにしたいと思っていますが、 この場合、XMLのタグがWEBブラウザでタグと認識され、除去されてしまいます。 XMLのタグを除去せず、そのまま画面に表示することは可能でしょうか? 可能であれば、その方法を教えていただけませんか? 宜しくお願いします。 今書いているコード DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder; builder = factory.newDocumentBuilder(); DOMImplementation domImpl = builder.getDOMImplementation(); Document document = domImpl.createDocument("","test",null); Element test = document.getDocumentElement(); Element aiueoNode = document.createElement("AAA"); Element abcdeNode = document.createElement("BBB"); aiueoNode.appendChild(document.createTextNode("あいうえお"); abcdeNode.appendChild(document.createTextNode("ABCDE"); test.appendChild(aiueoNode); test.appendChild(abcdeNode); TransformerFactory tf = TransformerFactoryImpl.newInstance(); tf.setAttribute(TransformerFactoryImpl.INDENT_NUMBER, "2"); Transformer transformer = tf.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.METHOD, "xml"); PrintWriter out = new PrintWriter(response.getOutputStream(), true); StringWriter writer = new StringWriter(); StreamResult result = new StreamResult(writer); DOMSource source = new DOMSource(document); transformer.transform(source, result); /**XMLを文字列にして出力**/ out.println(writer.toString()); 現在IE出力例は「あいうえおABCDE」ですが、下記のように出力したいです。 「<test>     <AAA>あいうえお</AAA>     <BBB>ABCDE</BBB> </test>」 宜しくお願いします。 java:1.6/tomcat:6.0/IE:8

    • ベストアンサー
    • Java
  • xmlのファイルがよめません

    XMLドキュメントのファイルがたくさんはいったものが送られてきましたが読めません。 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> とかでて内容がわかりません。 どうしたらよいですか

  • DOMのXML宣言値の変更

    XMLファイルをXMLパーサを使ってDOMにDocumentクラス変換します。 その変換してできたオブジェクトを操作して、 XML宣言のencodingの値を変更することは可能でしょうか?

    • ベストアンサー
    • Java
  • xmlファイルが生成されない

    <?php //DomDocumentを呼び出す $dom = new DomDocument('1.0','UTF-8'); //要素ノード[document]を追加 $document = $dom->appendChild($dom->createElement('document')); //新しい要素をdocumentの子要素として挿入する $document->appendChild($dom->createElement('name','名前です')); $document->appendChild($dom->createElement('text','テキストです。')); //字下げや空白を考慮してきれいに整形した出力を行う $dom->formatOutput = true; //同階層にtest.xmlとして保存 $dom->save('test.xml'); //出力 echo $dom->saveXML(); ?> のように、同じディレクトリ内にXMLファイルを生成するphpプログラムを作成してみたのですが、 ブラウザからこのPHPファイルにアクセスしてもXMLファイルが作られません。どうすれば良いのでしょうか。 なにかphp,apache等の設定をしてないからでしょうか。 よろしくお願いします。

    • 締切済み
    • PHP
  • Socket + XML

    ・クライアントはサーバへXML形式のクエリを送信し、 ・サーバからXML形式のデータを受け取る という単純なプログラムを実装しています。 しかしサーバ側の、InputStreamを引数とするXMLパースメソッドでwaitしてしまって困っています。 かといって、クライアント側のOutputStreamを閉じると、クライアントのソケット自体も閉じてしまいます。 なるべく一度のコネクションで送受信を終了させたいのですが、よい方法はないでしょうか? 一応、BufferedReaderを利用してXML文章を文字列に落としてから StringReaderをbuilder.parseの引数に与えることで解決出来てはいるのですがスマートではない気がしまして。 [Server側]  ServerSocket server_sock = new ServerSocket(12345);  Socket sock = server_sock.accept();  /* XMLパーサビルダ生成 */  DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();  DocumentBuilder builder = fact.newDocumentBuilder();  /* ドキュメント docIn の解析 */  Document docIn = builder.parse(sock.getInputStream());//ここから動かない(clientがoutputを終了するまで待っている?)  (略)  /* 結果ドキュメント docOut の構築*/  Document docOut = builder.newDocument();  (略)  /* docOut 送信 */  TransformerFactory tfactory = TransformerFactory.newInstance();  Transformer transformer = tfactory.newTransformer();  transformer.transform(new DOMSource(docOut), new StreamResult(sock.getOutputStream()));  sock.getInputStream().close();  sock.getOutputStream().close();  sock.close(); [Client側]  Socket sock = new Socket("localhost", 12345);  /* XMLパーサビルダ生成 */  DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();  DocumentBuilder builder = fact.newDocumentBuilder();  /* クエリドキュメント docOut の構築*/  Document docOut = builder.newDocument();  (略)  /* docOut 送信 */  TransformerFactory tfactory = TransformerFactory.newInstance();  Transformer transformer = tfactory.newTransformer();  transformer.transform(new DOMSource(docOut), new StreamResult(sock.getOutputStream()));  sock.getOutputStream().flush();  //sock.getOutputSream().close();//これにすると、socketが閉じてしまう  /* 結果ドキュメント docIn の解析 */  Document docIn = builder.parse(sock.getInputStream());//サーバから結果が送信されないので、クライアントはここで停止  (略)

    • ベストアンサー
    • Java
  • フォームからPOSTされた値をXMLへ書き込むプログラムなのですが、「

    フォームからPOSTされた値をXMLへ書き込むプログラムなのですが、「あ」を入力するとなにも書き込まれません。 「あ」以外は正常に書き込めるようです。 1日調べてみたのですが、どうしてもわかりません。 教えていただけないでしょうか。 情報が足りないようでしたら出させていただきますのでどうかよろしくお願いします。 $dom = new DomDocument('1.0','utf-8'); $dom->load($FilePath); $data = $dom->documentElement->parentNode->firstChild->appendChild($dom->createElement('data')); $testnode = $data->appendChild($dom->createElement('test')); $testtxt = mb_convert_encoding($_POST['test'],'utf-8','sjis'); $testnode->appendChild($dom->createTextNode($testtxt)); 環境 Windows2008サーバ php5.3.2 IIS7.0

    • ベストアンサー
    • PHP
  • XML ファイル parse 時の例外発生

    XML ファイル parse 時の例外発生 Java プログラムにて UTF-8 で書いた XML ファイルを DOM オブジェクトに読み込むときに、CJK Unified Ideograph Extension B などの (UTF-16 にて surrogate pair となるような) 字をコメント内に書くと、例外が発生します。何かよい回避方法は無いでしょうか。 例外は: org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0xd85a) was found in the comment. XML ファイルは encoding="UTF-8" としており、コメント以外のテキストにこれを書く分には、特に問題無く parse できています。 読み取りは DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); factory.setIgnoringComments(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("hoge.xml"); などとしています。JDK のバージョンは 1.6.0_17-b04 on Windows Vista。 当該文字を "" で囲んだり、通るタグ記述の形のままコメント化したりもしましたが、だめでした。 以上、よろしくお願いいたします。

  • XMLの読み込み

    DocumentBuilderFactory,DocumentBuilder等を使って XMLドキュメントの読み込みを行っています。 例えば、以下の様なXMLドキュメントがあった時 <text>内の読み込みを行うと、テキストテキスト2と なってしまいます。 「テキスト<p/><p/>テキスト2」として取得したいのですが 何かいい方法ないでしょうか? ----------------------------------------- <?xml version="1.0" encoding="Shift_JIS"?> <root> <text> テキスト<p/><p/>テキスト2</text> </root> ----------------------------------------- それとも、XMLドキュメント上、「<p/>」に意味があるのでしょうか? ※プログラム一部抜粋 //-- DOMオブジェクト初期化 DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); //-- XMLファイル読み込み this.doc = docBuilder.parse(new File(strPath)); this.doc.getDocumentElement().normalize();

    • ベストアンサー
    • Java
  • XML DOMについて

    JavaScriptでDOMを使用して、xmlhttp.sendで指定のPHPファイルに送信しましたが、 PHP側で値を取得できません。 (PHP Ver.5.3.0) 以下、JavaScript var UserID="abc"; var Password="abc"; var xmlDoc = new ActiveXObject("Microsoft.XMLDom"); xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml","version=\"1.0\"")); var root = xmlDoc.createElement("xDoc"); xmlDoc.documentElement=root; var node_Item = xmlDoc.createElement("Command"); root.appendChild(node_Item); var node_UserID = xmlDoc.createElement("UserID"); node_UserID.appendChild(xmlDoc.createTextNode(UserID)), node_Item.appendChild(node_UserID); var node_Password = xmlDoc.createElement("Password"); node_Password.appendChild(xmlDoc.createTextNode(MDString(Password))), node_Item.appendChild(node_Password); var node_Sufix = xmlDoc.createElement("Sufix"); node_Sufix.appendChild(xmlDoc.createTextNode(Sufix)), node_Item.appendChild(node_Sufix); var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.open("post",topURL("main/Log.php"),false); xmlhttp.send(xmlDoc); 以下、Log.php <?php session_start(); $DEBUG_MODE=false; $xmlLogQ=$_SERVER['DOCUMENT_ROOT']."/test/temp/Request.xml"; $xml = new DOMDocument(); $xml->async=false; if (!$DEBUG_MODE) { if ($XML_LOG) { $xml->save($xmlLogQ); } } else { if ($XML_LOG) { $xml->load($xmlLogQ); } } $doc=$xml->documentElement; if ($xml->parseError.errorCode==0) { $xml = $node=$doc->selectSingleNode("Command/UserID"); if (!($node==null)) { $UserID=$node->text; $node=null; } $node=$doc->selectSingleNode("Command/Sufix"); if (!($node==null)) { $Sufix=$node->text; $node=null; } $node=$doc->selectSingleNode("Command/Password"); if (!($node==null)) { $Password=$node->text; $node=null; } } ?> 保存したXML上、<?xml version="1.0"?>以降書き込みできてません。 どの部分がおかしいか不明の為、申し訳ないですがご教授お願いします。

    • ベストアンサー
    • PHP