アプリ版:「スタンプのみでお礼する」機能のリリースについて

当方JAXPでXMLを扱っています。
今悩んでいることなのですが、DOMオブジェクトを保存しようとすると、実態参照をつくることができません。
何かよい方法はありませんか?
また、実態参照について、私のほうに根本的な間違いや知らなければならないことがあるのでしょうか。
よろしくお願いします。

----------サンプルソース------------
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.newDocument();
Element root = document.createElement("root");
// 実態参照を挿入
root.appendChild(document.createTextNode(""));
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 :
<?xml version="1.0" encoding="UTF-8" standalone="no"?><root>&amp;nbsp;</root>
--------------望む結果--------------
on dom :
<?xml version="1.0" encoding="UTF-8" standalone="no"?><root></root>
--------------------------------------

A 回答 (2件)

やあ、また会ったね。


回答しつつも,当方の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 :
<?xml version="1.0" encoding="UTF-8" standalone="no"?><root></root>

ではなく

on dom:>
<?xml version="1.0" encoding="UTF-8" standalone="no"?><root>&gt;</root>
を望んでいるつもりだ。
on domが&gt;でない点に注意!

あと
×実態参照
○実体参照 

    • good
    • 0
この回答へのお礼

いつもありがとうございますー。
え、Javaついに1.7でたんですか!
早速調べなきゃ!

document#createEntityReference
は、試してみたんですけれど、himajin10万さんの結果のように、なぜか無視されるので、それが答えなのかどうかがわかりませんでした。
「on dom」で出力しているところからわかるように、きっとTransformer通すときに実体参照にもどせてないのが原因みたいなんですが・・。

あと試してみたことといえば、
DocumentBuilderFactory#isExpandEntityReferences(false)
初期値がtrueだそうで、名前からするに、実体を展開するかどうかの設定みたいなので、falseにすれば展開されずにそのまま残るんじゃないなかと思いまして・・。結果は何も変わらなかったように見えました。パースするときしか意味がないのかな??

>×実態参照
>○実体参照 
ありがとうございます。
もしかしたら正しい文字列で検索すれば、もっと有益な情報が検索できるようになるかもしれません。

お礼日時:2007/12/01 09:31
    • good
    • 0
この回答へのお礼

リンク先に記述してあるように、processing-instructionをうまく利用すると、今回の私の目的は達成できるようです。

一応は解決ということで、締め切らせて頂きました。
ありがとうございました。

お礼日時:2007/12/04 21:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!