
Rubyにおける、XPathの関数「text()="x"」への変数の使用方法
お世話になります。
RubyにてXPathの関数「text()="x"」"x"の部分に変数を使用したいと思い、コードを作成しています。
text() 関数のところで困っています。
例えば
<?xml version="1.0" encoding="UTF-16"?>
<NameRoot>
<Text>
<Name>あああああ</Name>
<No>001</No>
</Text>
<Text>
<Name>いいいいい</Name>
<No>002</No>
</Text>
<Text>
<Name>ううううう</Name>
<No>003</No>
</Text>
</NameRoot>
の内容のファイルを読み込み、その中から該当するNoに相当するNameを取得しようと
しています。
で、書いたのが下記のような内容なのですが、gettestクラスのgetNameメソッドにて
コメントアウトしてある行であれば、決め打ちでNo="001"の物を取ってこれるのですが、
ここに引数として渡されたローカル変数の、idを使用しようとするとnode変数にNilClass
が返ってきて取得できません。
文字列リテラルを色々調べてみたのですが、どうも上手く行かず困っています。
他愛も無い質問かもしれませんが、大変困っています。
どなたか知恵をお貸しくださいますようお願い致します。
class gettest
def getName(id)
#↓これがきちんと動きません
node = REXML::XPath.first(@masterdata, '//NameRoot/Text/No[text()="#{id}")]')
#↓こちらは当然ながら動きます
# node = REXML::XPath.first(@masterdata, '//NameRoot/Text/No[text()="001"]')
path = (node.xpath + "/../Name")
@name = @masterdata.elements[path].text()
end
end
class main
def edit
@mastername = ""
@mastername = @master.getName("001")
print @mastername
end
end
No.2ベストアンサー
- 回答日時:
#{式} の展開は、" " の中だけです。
' ' の中では効きません。node = REXML::XPath.first(@masterdata, "//NameRoot/Text/No[text()='#{id}')]")
No.1
- 回答日時:
未検証
#Ruby碌にやってないから知らんけど、XMLファイルというかリソースというかそういうもの読み込む部分無くて大丈夫なのかなあ?
node = REXML::XPath.first(@masterdata, '//NameRoot/Text/No[text()="001"
)
]
'
)
閉じ丸括弧一つ多くね?
メモ
============================
RubyやってないのでここからC#の話が中心ー。
id = '" or "" = "'
とか…
node = REXML::XPath.first(@masterdata, '//NameRoot/Text/No[text()="" or "" = ""]')
安全にやりたい。外側でチェックしているならまだいいけど。
あと、今回見たいな文法ミスのケースで例外吐いてくれない。
#ま、ひょっとしたら今回みたいなSyntax Errorとノードが実際に見つからなかった時の戻り値って違うのかもしれない。
その場合は以下は不要
こうやってノードを作って足し、検索すればいいんじゃないかなー
.NET Frameworkのリファレンスには名前空間接頭辞以外の文法エラーについて書いてないけどどーなんだろう。
using System;
namespace Q5736805
{
class MainClass
{
public static void Main (string[] args)
{
}
public static System.Xml.XmlNode findNode(string x){
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
System.Xml.XmlDocument doc2 = new System.Xml.XmlDocument();
/* 間違って上書きしないようにしている。メモリの無駄な気もするが。*/
doc.Load("C:\\aaa.xml");
doc2 = doc.CloneNode(true);
System.Xml.XmlElement text = doc2.CreateElement("Text","");
System.Xml.XmlElement no = doc2.CreateElment("No");
no.InnerText = "XXX";
text.AppendChild(no);
doc2.DocumentElement.AppendChild(text);
System.Xml.XmlNode ret = doc2.SelectSingleNode("//NameRoot/Text/No[text()=../No[last()]/text()]");
if (ret == null){
throw new Exception();
}
return (ret != text) ? ret : null ;
}
}
}
nullだったら文法間違いだから例外を吐くことにして、そうでなければ戻り値を返す、と。できるんじゃないかな。
ありがとうございました。
閉じ括弧は実際のプログラムからサンプルとして抜き出す際にやってしまいました。
申し訳ありませんでした。
参考になりました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1、Rstudioで回帰直線を求める...
-
パソコンのスクリーンセーバー...
-
pandasでsqlite3にテーブル作成...
-
英数字を含む文字列(0-9,A-Z)...
-
(再質問)エクセルのマクロボ...
-
100万件越えCSVから条件を満た...
-
C言語の入力した文字を反転させ...
-
WIN11にオフイスを複数入れるこ...
-
Accessで文字列のバイト数読み込み
-
回復ドライブとインストールメ...
-
Ruby require ライブラリー
-
ruby OpenURI::Meta
-
ルビー言語 ライブラリー
-
Ruby 変数 用途と違い
-
WinSCPで画像のように puttyを...
-
教えてください
-
プログラミングについてです。...
-
pythonエラー
-
WSLのUbuntuで、Railsのインス...
-
ruby while式
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「&」 「<<」 「|」 につ...
-
Ruby 改行文字の挿入
-
Visual Basicがわかりません。
-
Excelマクロ 空白セルを無視し...
-
バッチ処理 特定の文字以降を...
-
VBAでcsvファイルもシートもあ...
-
ダブルコーテーション付きでCSV...
-
【ExcelVBA】300万件越えCSVか...
-
INPUTタグ disabledの文字色を...
-
ファイル名を変数で書きこむfwr...
-
VBAで複数のCSVからレコードセ...
-
VBA テキストボックスを選択状...
-
CSVで余計な空行が入る
-
Access VBA エラー2448について
-
複数のファイルをまたぐエクセ...
-
VB.netでShellExecuteがしたい
-
LibreOffice Calcのマクロで、...
-
verilog HDLについての質問です...
-
【C#】 csvファイルをバイナリ...
-
pythonでリストをCSVに出力する...
おすすめ情報