htmlに書き込んだjsで、プルダウンメニュとテキストボックスに入力した検索語で、xmlから条件に合ったデータを抽出し、別のhtmlに書き出すという仕組みなんですが、下記のようにxmlデータに実体参照を使用すると、jsが動きません。なぜでしょうか?
もちろん、実体参照の箇所を消去すると、作動します。
お分かりの方、ご教授くださいませ。よろしくお願いいたします。
★検索エンジン部分(js)
function disp(){
var strTitl=parent.up.form.title.value;
var strAuthr=parent.up.form.author.value;
var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.async=false;
objDoc.load("books.xml");
flg=false;
strFlt="/books/book";
if(strTitl!=""){
strFlt+="[(title = '" + strTitl + "')";
flg=true;
}
if(strAuthr!=""){
if(flg){
strFlt+=" and ";
}else{
strFlt+="[";
flg=true;
}
strFlt+="(author ='" + strAuthr + "')";
}
if(flg){strFlt+="]";}
var clnNod=objDoc.selectNodes(strFlt);
with(parent.down.document){
open("text/html");
writeln("<html><head><title></title></head><body>");
for(i=0;i<clnNod.length;i++){
objNod=clnNod.item(i);
objTit=objNod.selectSingleNode("title");
objAut=objNod.selectSingleNode("author");
objPrc=objNod.selectSingleNode("price");
objId=objNod.selectSingleNode("@id");
writeln("<table border='1'><tr><td>");
writeln(objId.text + ".</td><td>");
writeln(objTit.text + "(" + objAut.text + ")" + "</td><td>");
writeln(objPrc.text + "円</td></tr></atble>");
}
writeln("</body></html>");
close();
}
}
★xmlデータ(books.xml)
<?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE books[<!ENTITY y2000 "2千円">]>
<books>
<book id="001"><title>タイトルA</title><author>作者A</author><price>&y2000;</price></book>
</books>
No.1ベストアンサー
- 回答日時:
MSXMLがXMLを読み込んで解析する際に,DTD部分がinvalidと判断されてエラーになっているのだと思います。
次のように,validateOnParseプロパティをfalseにしてみたらどうでしょうか。
var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.validateOnParse = false; //←追加
objDoc.async=false;
初めましてnaderaさん!
回答いただきましてありがとうございます
ご指摘どおりやってみましたが、残念ながら効果なしです
xml fileに<!DOCTYPE books[<!ENTITY y2000 "2千円">]>と宣言して
指定箇所に &y2000; と記述することで間違いはないんですよね
xml初心者なもので何が間違っているものなのか見当が付きません
実体参照を記述すると、エラーメッセージが出ることなく、検索ボタンを押しても何の反応もないんです
実体参照を消すと、検索されるんです
ちんぷんかんぷんです
ご気付きの点がありましたら、また回答いただけるとありがたいです
No.3
- 回答日時:
メモ:
1.要素型宣言や属性宣言を全部追加しないと当方環境ではエラー(validateOnParse=true)
2.XPath Injectionってのがあって苦労するかもね
himajin100000さん、ご回答いただきありがとうございます
1.をやってみても改善されなかったような気がするんですが記憶違いかな?
XPath Injectionですか!?
便利な機能だと思った実体参照がこうも容易に機能しないなんて結構XMLって不便ですね
ご回答ありがとうございました
XML初心者ですが、またの質問の際にはよろしくお願いいたします
No.2
- 回答日時:
(回答1の回答者です)
最初の回答では試してみませんでしたが,次のような簡単な形で試してみて,一応,表示されるようです。
XMLは,質問と同じものです。(encodeは小生の趣味でutf-8にしていますが,本質的な問題ではないと思います。)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE books[<!ENTITY y2000 "2千円">]>
<books>
<book id="001">
<title>タイトルA</title>
<author>作者A</author>
<price>&y2000;</price>
</book>
</books>
HTMLとjavascriptは,次のように簡単にしました。質問と同じものに復元して実行するのが面倒でしたので。
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script language="javascript" type="text/javascript">
<!--
function disp(){
var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.validateOnParse = false;
objDoc.async=false;
objDoc.load("books.xml");
test.innerHTML=objDoc.selectSingleNode("books//price").text;
}
//-->
</script>
</head>
<body onload="disp()">
<div id="test"></div>
</body>
</html>
XMLとHTMLを同じフォルダにおいてHTMLを表示すると,2千円と表示されると思います。
javascriptの,objDoc.validateOnParse = false;をコメントアウトしてhtmlを表示させるとエラーとなり表示しないはずです。
なので,ENTITYの問題だけであるなら,objDoc.validateOnParse = false;を付け加えれば,表示できるはずなのですが・・
最初から objDoc.validateOnParse = false が記述されている
他のプログラムでもENTITY宣言して試してみましたが作動しませんでした
どうやら、他の原因のようですね
またの質問の際はよろしくお願いします
どうもありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- PHP php ログイン 1 2022/11/01 00:24
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XMLで特殊文字を扱うにはどうし...
-
XMLで要素が記述された順番に意...
-
CPUの考え方を教えてください ...
-
東芝のDynabookなのですがアン...
-
SNMP リンクダウンとノードダ...
-
Excel-VBAでXMLの複数ノードの...
-
XPathで途中に名前空間が設定さ...
-
バッチファイルでテキストファ...
-
C#で使用中のファイルに別のフ...
-
昔Winnyってありましたけど、あ...
-
c言語 ノードの連結
-
VBAでXMLを出力するプログラム...
-
ルート要素ノードが2個ある場合?
-
DOSコマンドラインからxmlファ...
-
UTF-8でエンコーディングとはど...
-
同じタグ名の項目取得
-
コンテキストメニュークリック...
-
複数のマックPCによる数値計算...
-
プログラミングC言語について次...
-
ツリービューのノードをダブル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XMLで特殊文字を扱うにはどうし...
-
html→xmlの変換
-
終了タグが認識されない?
-
東芝のDynabookなのですがアン...
-
CPUの考え方を教えてください ...
-
XMLで要素が記述された順番に意...
-
昔Winnyってありましたけど、あ...
-
バッチファイルでテキストファ...
-
XML、XSLTの適応エラー(IEから...
-
UTF-8でエンコーディングとはど...
-
SNMP リンクダウンとノードダ...
-
ルート要素ノードが2個ある場合?
-
XMLファイル内のデータ(値)を変...
-
xmlファイルが上手にHTMLに変換...
-
同じタグ名の項目取得
-
ExcelVBAで書き出した文字が化ける
-
XPathで途中に名前空間が設定さ...
-
あるノードリストに、特定の名...
-
ノードとは
-
TreeView の初期表示について
おすすめ情報