• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:JavaScript で実体参照を扱うには)

JavaScriptで実体参照を扱う方法

このQ&Aのポイント
  • JavaScript上でXHTML上の実体参照を含む文字列を生成する方法を教えてください。
  • String.fromCharCode()などを使用すれば数値参照は文字化できますが、一文字に変換する方法がわかりません。
  • 現在はXHTML本文にテキストを書いてJavaScriptで読み込んで活用していますが、もっと直截的な方法が知りたいです。

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

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.4

>任意の外部 XML 文書 DOM オブジェクトの実体参照 XMLは詳しくないので、あまり自信はありませんが・・・ 外部XML文章を開くと言うことはパーサーを使うんですよね? JavaScriptのみで開けます? function conv(f,s) { var XMLdoc = new ActiveXObject('microsoft.XMLDOM'); XMLdoc.async = false; XMLdoc.load(f); var ref = XMLdoc.createEntityReference(s); return ref.text; } IE限定ですが、MSXML使って、こんな感じでどうでしょう? conv("foo.xml","hearts") // & と ; は不要

beubeu
質問者

お礼

ご回答ありがとうございます。 おお、まさにこれですね。なるほど createEntityReference はこういう使い方をするのですか。 実行してみたところ、XHTML 以外でも XHTML + MathML などで MathML 独自の entity でも上手く出力が得られました。ありがとうございます。 あとは FireFox 用に var doc = document.implementation.createDocument("", "", null); doc.load("foo.xml"); var ref = doc.createEntityReference("hearts"); と実行してみたのですが、ref は null でした。createDocument のパラメータを createDocumentType などを使用して埋めてもやはり null しか返されません。 https://bugzilla.mozilla.org/show_bug.cgi?id=9850 どうも昔からあるバグのようです (;_;)

beubeu
質問者

補足

「この回答へのお礼」の補足です。 とりあえず FireFox に関しては、動的に、対象となる XML 文書を作り出してそこから読み出す、くらいしか浮びませんでした。 たとえば、MathML という XML の entity の ExponentialE を取り出すとき、次のようにして取り出せました。 var doc = (new DOMParser()).parseFromString([ '<?xml version="1.0"?>', '<!DOCTYPE math PUBLIC "-//W3C//DTD MathML 2.0//EN" "dtd/mathml2.dtd">', '<math xmlns="http://www.w3.org/1998/Math/MathML">&ExponentialE; </math>' ].join("\n"), "text/xml"); var result = doc.documentElement.firstChild.nodeValue; 姑息というかなんというか (^^;

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • venzou
  • ベストアンサー率71% (311/435)
回答No.3

#1、2です。連続で失礼します。 何とか変換する方法を探ってみました。 innerHTMLを利用することで、変換することは出来ました。しかし、スマートな方法ではないし、ブラウザによってはうまく動きません。 ・WindowsXP IE6で動作確認 ・Opera8、FireFox2 では &nbsp; が 0x20(通常のスペース)に変換される。 上記を応用した変換後の文字コードを調べるプログラムです。 <html><head> <script language="JavaScript"><!-- function change(){ inp1 = document.getElementById("input1"); spn1 = document.getElementById("span1"); inp3 = document.getElementById("input3"); spn1.innerHTML = "<input id='input2' type='text' value='" + inp1.value + "'>" inp2 = document.getElementById("input2"); inp3.value = inp2.value.charCodeAt(0).toString(16); } // --></script> </head><body> <form> <input id='input1' type='text'> データ(例:&amp;nbsp;)<br> <input type="button" value='変換' onClick='change()'><br> <span id='span1'> <input id='input2' type='text'> </span> 変換後<br> <input id="input3" type='text'> Unicode(16進数)<br> </form> </body></html>

beubeu
質問者

お礼

ご回答ありがとうございます。 なるほど、innerHTML を使うと変換可能ですね。これをヒントに次のような文字列変換関数を作ってみました。 function conv(s) { var span = document.createElement("span"); span.innerHTML = s; return span.firstChild.nodeValue; } これで conv("&hearts;") 等で期待通りの値が返るようになりました。IE7, FireFox2, Opera9 でも動作はするようです。 ただ、多分この innerHTML はメインの文書ファイルの DTD 等のエンティティ定義に従うのですよね? できれば任意の外部 XML 文書 DOM オブジェクトの実体参照が使えると嬉しいのですけれども。

すると、全ての回答が全文表示されます。
  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

#1です。 >たとえば 質問のここを見落としていました。&nbsp;は一例ですね。汎用的に変換できる方法をお探しですね。失礼しました。 これに関しては分かりませんでした。 補足 >msg += String.fromCharCode(0xA0); msg += "\u00A0"; unicodeを入れるのは、単にこれだけで良かったです。

すると、全ての回答が全文表示されます。
  • venzou
  • ベストアンサー率71% (311/435)
回答No.1

&nbsp;はunicodeで 0xA0 のようです。 以下のHTMLで検証しました。 <html><body> ↓通常のスペース<br> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<br><br> ↓&amp;nbsp;ウインドウサイズを狭くしても改行されません。<br> <script language="JavaScript"><!-- msg = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; msg += String.fromCharCode(0xA0); msg += "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; document.write(msg); // --></script> </body></html>

参考URL:
http://www.fileformat.info/info/unicode/char/00a0/index.htm
すると、全ての回答が全文表示されます。

関連するQ&A