
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ランキング
-
初心者プログラミング
-
Ruby require ライブラリー
-
ruby OpenURI::Meta
-
ruby loopメソッド 変数(再喝)
-
ruby 配列
-
ruby loopメソッド 変数
-
ルビー言語 ライブラリー 追記
-
ruby while式
-
ruby クラス・オブジェクト・イ...
-
教えてください
-
英数字を含む文字列(0-9,A-Z)...
-
Rubyで掲示板は作れますか
-
(再質問)エクセルのマクロボ...
-
ビーリアルのユーザー名を変え...
-
pandasでsqlite3にテーブル作成...
-
パイソンエラーについて
-
ruby raise句
-
ruby begin句
-
ruby ensure句
-
ルビー言語 ライブラリー(再々...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Ruby 正規表現で特定の文字を取...
-
Ruby 改行文字の挿入
-
文字コードの変換について教え...
-
Ruby 正規表現による文字列取得
-
Ruby 文字の挿入(置換)
-
Ruby 正規表現での文字列取得
-
REXMLについて教えてください2
-
Ruby 正規表現と置換
-
「&」 「<<」 「|」 につ...
-
Ruby flagによるファイルの特定...
-
{Ruby}ディレクトリ内の全ての...
-
Rubyの正規表現、文字の追加
-
Ruby flagによるファイルの特定...
-
Ruby 改行文字の認識
-
Rubyにおける、XPathの関数「te...
-
VBAでcsvファイルもシートもあ...
-
Excelマクロ 空白セルを無視し...
-
【ExcelVBA】300万件越えCSVか...
-
バッチ処理 特定の文字以降を...
-
ダブルコーテーション付きでCSV...
おすすめ情報