
お世話になります。
現在、XPathに関するプログラムを制作しています。
入力されたXPathを解析し、解析した内容に応じて特定の処理をさせるというものなのですが、text() 関数の解析で躓いています。
text()="value"
ここまではわかります。
text()='value1"value2\value3'
上のケースでは、どのように記述すればいいのでしょうか?
シングルコーテーションで括るという解では、シングルコーテーションとダブルコーテーションが混在している場合に対応できません。
そのプログラムではクオート文字をダブルコーテーションに限定しているので、ダブルコーテーションのエスケープ方法を探しています。
現在はバックスラッシュ(\)によるエスケープ処理で対応しています。
text()="value1\"value2\\value3"
しかし、Firefox拡張「XPath Checker」で調べるとバックスラッシュによるエスケープ処理は働いていないため、
この方法は正しくない気がしています。
プログラムとしては問題なく動作していますが、XPath記法に沿っていないのは落ち着きません。
何かヒントとなる情報はないでしょうか?
No.1ベストアンサー
- 回答日時:
一つのリテラルで表記するのは無理だと思います。
…と思ったんだけどなあまず,XPath 1.0規格で一つのリテラルで表現する事はできないようです。
http://www.w3.org/TR/xpath#NT-Literal
>そのプログラムではクオート文字をダブルコーテーションに限定しているので、
これがなく,一つのリテラルでなくて良い(計算結果でも良い)なら
回避策として
concat("AB'C",'DE"F')
とかどうにでもなるとは思うんですが。
念のためにXPath 2.0の構文を調べてみたら
http://www.w3.org/TR/xpath20/#id-literals
EscapeQuotやEscapeAposなんてものがあるので
多分"abc""def"というような表記が可能なようです。
#XPath 1.0同様にあとはXQuery 1.0 and XPath 2.0 Functionsの
http://www.w3.org/TR/xpath-functions/#func-codep …
で計算してごまかすぐらい?
#実際にアドオンをインストールしていないのでFirefox AddonsがXPath 2.0に対応しているかは判りません。
#本題とは関係ないけど,プログラムのユーザーが
文字列を入力してそれが含まれるような要素を探すようなプログラムなら,XPath Injectionとか怖いから
文字列をXPath Expressionに直接つながないで,要素加えてからやるかな。
XPath1.0仕様上ではエスケープ手段が用意されていないのですね。
あの後、仕様書に行き着きましたが理解が足りないだけかも、との思いから先に進めずにいました。
> EscapeQuotやEscapeAposなんてものがあるので
ありがとうございます!
この方法でエスケープするようにしてみます。
(残念ながら、「XPath Checker」では機能しませんでした。XPath2.0準拠の動作ではないようです。)
> #本題とは関係ないけど,プログラムのユーザーが
> 文字列を入力してそれが含まれるような要素を探すようなプログラムなら
逆にユーザが入力したXPathに対応したノードを作成します。(XPathの文法は借りましたが、動作は逆です)
例えば、以下のように。
入力: p[@class="xpath"][text()="XPathですよ"]
出力: <p class="xpath">XPathですよ</p>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba listviewにおけるtextのAli...
-
三次元のグラフを書きたいので...
-
世界一美しいソースコード
-
プログラミングの問題と解答例...
-
XPathの関数「text()="value"」...
-
C言語でのソケット通信のclose
-
Pythonで仮想通貨の自動売買が...
-
Arduino nano(アルドゥイーノ ...
-
プログラムってコードに性格っ...
-
初級者の質問――time_tについて
-
COBOLのS9タイプからXタイプへ...
-
任意ソフトのテキストボックス...
-
2値化した画像の黒い部分のピク...
-
Macターミナルで実行中のプログ...
-
C# シリアル通信でデータ受信...
-
TCP/IP通信時のサーバーからの受信
-
タスクマネージャーのプロセス...
-
バックグラウンドのプロセスの...
-
家電製品の電力周波数を変える機械
-
メモリーリークエラーが起こる
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vba listviewにおけるtextのAli...
-
指定したフォルダーを最前面表...
-
マイコンからプログラムを読み...
-
初級者の質問――time_tについて
-
2値化した画像の黒い部分のピク...
-
プロダクションコードとは?
-
gccでスタックオーバーフローの...
-
Arduino nano(アルドゥイーノ ...
-
世界一美しいソースコード
-
expectを使用しない対話型処理
-
C言語で1000までの素数を求める...
-
c言語 コマンドライン引数
-
Ofの使い方
-
COBOLのS9タイプからXタイプへ...
-
winsockを使った通信方法
-
無限ループ中にある任意のキー...
-
通信ゲームを作りたいんですが
-
デュアルCPUでのプログラミング...
-
HPBが立ち上がらない
-
遠方界のプログラム
おすすめ情報