![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
お世話になります。
現在、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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- その他(プログラミング・Web制作) pythonでのカーソル移動がずれる 2 2023/07/30 08:51
- Visual Basic(VBA) VBA 重複チェック後に値をワークシートに転記する方法を教えてください。 1 2023/03/19 12:43
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- その他(プログラミング・Web制作) pythonにおける単方向リストの実装について 4 2022/07/13 12:34
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba listviewにおけるtextのAli...
-
c言語のサイコロを100回振って...
-
processingで雪が積もるような...
-
時刻歴応答解析
-
指定したフォルダーを最前面表...
-
テキストの暗号化
-
プロダクションコードとは?
-
コードプロテクトについて
-
初級者の質問――time_tについて
-
butter worth形LPFの設計プログ...
-
gccでスタックオーバーフローの...
-
DLLから他のプロジェクト変数の...
-
2値化した画像の黒い部分のピク...
-
コンパイルエラーの意味
-
どうやってパソコンなどの凄い...
-
WindowsCとWindowsプログラムの...
-
C言語primeについて
-
javaで辞書プログラムを作りたい.
-
Labviewって・・・
-
プログラムのコーディングって...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vba listviewにおけるtextのAli...
-
Webプログラムってネイティブア...
-
プロダクションコードとは?
-
指定したフォルダーを最前面表...
-
VBA
-
初級者の質問――time_tについて
-
Arduino nano(アルドゥイーノ ...
-
世界一美しいソースコード
-
2値化した画像の黒い部分のピク...
-
C言語primeについて
-
COBOLのS9タイプからXタイプへ...
-
無限ループ中にある任意のキー...
-
マイコンからプログラムを読み...
-
processingで雪が積もるような...
-
Excel VBA で、データベースフ...
-
openGLで物体を半透明にして表...
-
C言語→MATLABへの変換で、困っ...
-
三次元のグラフを書きたいので...
-
コンパイルエラーの意味
-
プログラムってコードに性格っ...
おすすめ情報