
お世話になります。
現在、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...
-
マイコンからプログラムを読み...
-
VBコンソールアプリ(.NET Frame...
-
2値化した画像の黒い部分のピク...
-
CGIの記述について教えてくださ...
-
c言語 コマンドライン引数
-
URLの最初の「h」を略す
-
タイトルバーのダブルクリック...
-
32×16ドットマトリクスLED拡張...
-
プログラミングの問題と解答例...
-
マウスカーソルの表示・非表示
-
ubuntuでC++のGUIプログラム
-
プロダクションコードとは?
-
自分のHTMLサイトでRSSを読み込...
-
USBカメラのTWAIN制御について
-
無限ループ中にある任意のキー...
-
プログラムってコードに性格っ...
-
expectを使用しない対話型処理
-
Macターミナルで実行中のプログ...
-
C# シリアル通信でデータ受信...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vba listviewにおけるtextのAli...
-
プロダクションコードとは?
-
マイコンからプログラムを読み...
-
指定したフォルダーを最前面表...
-
初級者の質問――time_tについて
-
COBOLのS9タイプからXタイプへ...
-
Arduino nano(アルドゥイーノ ...
-
i-mode
-
無限ループ中にある任意のキー...
-
三次元のグラフを書きたいので...
-
2値化した画像の黒い部分のピク...
-
XPathの関数「text()="value"」...
-
DCOMのアプリで配布用プロ...
-
マウスカーソルの表示・非表示
-
C言語primeについて
-
世界一美しいソースコード
-
gccでスタックオーバーフローの...
-
VBAのプログラムが動いているか...
-
openGLで物体を半透明にして表...
-
cとVisual Basic
おすすめ情報