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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonで会員サイトの自動ログイン ID Nameがない 1 2022/12/16 02:09
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- HTML・CSS 書籍を見つつサイト造りの練習をしているのですが、見た目が一致しません 2 2022/11/28 15:00
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript Javascriptを使ってQRコード読み取り、取得した情報をPOSTしたいと思っています。 1 2023/04/28 15:18
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パソコンのスクリーンセーバー...
-
VBScriptでExcel(2019)上のデー...
-
ビーリアルのユーザー名を変え...
-
教えてください
-
(再質問)エクセルのマクロボ...
-
pandasでsqlite3にテーブル作成...
-
英数字を含む文字列(0-9,A-Z)...
-
pythonのerrorコード
-
1、Rstudioで回帰直線を求める...
-
パイソンのクラスについて
-
【メモリ不足で落ちる(python)】
-
バーチャルボックスが使えなく...
-
GitHubは初年度以外は有料にな...
-
パイソンプログラミング
-
VSコード
-
GitHubについて
-
初心者 パイソンプログラム
-
Rubyについて質問です
-
VBA メモ帳の上書き保存がしたい
-
三項でたとえば交換って
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「&」 「<<」 「|」 につ...
-
バッチ処理 特定の文字以降を...
-
Excelマクロ 空白セルを無視し...
-
【ExcelVBA】300万件越えCSVか...
-
VBAでcsvファイルもシートもあ...
-
ダブルコーテーション付きでCSV...
-
[コンパイルエラー 修飾子が不...
-
VBA テキストボックスを選択状...
-
Access VBA エラー2448について
-
INPUTタグ disabledの文字色を...
-
EXCEL→CSV保存時のダブルクォー...
-
teratermで、ファイル名をinput...
-
パイソンでテキストファイルが...
-
VB.netでShellExecuteがしたい
-
VBAで複数のCSVからレコードセ...
-
StringGridの中身をCSV形式で保...
-
fortranでNAのあるデータを読み...
-
CSVで余計な空行が入る
-
複数のファイルをまたぐエクセ...
-
Fortran:列数の分からないデー...
おすすめ情報