プロが教える店舗&オフィスのセキュリティ対策術

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>

A 回答 (3件)

MSXMLがXMLを読み込んで解析する際に,DTD部分がinvalidと判断されてエラーになっているのだと思います。


次のように,validateOnParseプロパティをfalseにしてみたらどうでしょうか。

var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.validateOnParse = false; //←追加
objDoc.async=false;
    • good
    • 0
この回答へのお礼

初めましてnaderaさん!
回答いただきましてありがとうございます
ご指摘どおりやってみましたが、残念ながら効果なしです

xml fileに<!DOCTYPE books[<!ENTITY y2000 "2千円">]>と宣言して
指定箇所に &y2000; と記述することで間違いはないんですよね
xml初心者なもので何が間違っているものなのか見当が付きません

実体参照を記述すると、エラーメッセージが出ることなく、検索ボタンを押しても何の反応もないんです
実体参照を消すと、検索されるんです

ちんぷんかんぷんです
ご気付きの点がありましたら、また回答いただけるとありがたいです

お礼日時:2008/11/29 01:43

メモ:


1.要素型宣言や属性宣言を全部追加しないと当方環境ではエラー(validateOnParse=true)
2.XPath Injectionってのがあって苦労するかもね
    • good
    • 0
この回答へのお礼

himajin100000さん、ご回答いただきありがとうございます
1.をやってみても改善されなかったような気がするんですが記憶違いかな?
XPath Injectionですか!?
便利な機能だと思った実体参照がこうも容易に機能しないなんて結構XMLって不便ですね
ご回答ありがとうございました
XML初心者ですが、またの質問の際にはよろしくお願いいたします

お礼日時:2008/11/29 16:43

(回答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;を付け加えれば,表示できるはずなのですが・・
    • good
    • 0
この回答へのお礼

最初から objDoc.validateOnParse = false が記述されている
他のプログラムでもENTITY宣言して試してみましたが作動しませんでした
どうやら、他の原因のようですね
またの質問の際はよろしくお願いします
どうもありがとうございました

お礼日時:2008/11/29 16:36

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