お世話になります。
現在、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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
三次元のグラフを書きたいので...
-
どうやってパソコンなどの凄い...
-
BASIC
-
Visual Studio .NET C# でDLLを...
-
WindowsCとWindowsプログラムの...
-
PL/SQLを自宅で組める環境
-
XPathの関数「text()="value"」...
-
vba listviewにおけるtextのAli...
-
Arduino nano(アルドゥイーノ ...
-
連立方程式
-
ソケット通信プログラムのヘッ...
-
UWSCというマクロソフトの「U...
-
プログラミング、計算機科学、d...
-
c言語プログラムでキーボードか...
-
共分散行列を求めるプログラム
-
GPUとCPUを使えば簡単に高速化...
-
プログラミングのバイトをした...
-
HSPで歩行アニメーションのプロ...
-
butter worth形LPFの設計プログ...
-
プロダクションコードとは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プロダクションコードとは?
-
マイコンからプログラムを読み...
-
vba listviewにおけるtextのAli...
-
自分のHTMLサイトでRSSを読み込...
-
指定したフォルダーを最前面表...
-
Arduino nano(アルドゥイーノ ...
-
プログラミングの問題と解答例...
-
COBOLのS9タイプからXタイプへ...
-
2値化した画像の黒い部分のピク...
-
無限ループ中にある任意のキー...
-
初級者の質問――time_tについて
-
Excel VBA じゃんけん
-
どうやってパソコンなどの凄い...
-
三次元のグラフを書きたいので...
-
VBコンソールアプリ(.NET Frame...
-
NumLockの制御について
-
世界一美しいソースコード
-
expectを使用しない対話型処理
-
Excel VBA で、データベースフ...
-
C言語→MATLABへの変換で、困っ...
おすすめ情報