- PR -

System.XMLでのXpathについて

1
投稿者投稿内容
タガ
会議室デビュー日: 2006/10/20
投稿数: 5
投稿日時: 2006-12-29 16:34
以前,この掲示板でDOMについて質問させていただいたタガです.
その節はありがとうございました.

同じスレッドに記入しようと思ったのですが,
ちょっと使っている環境も変わっているので新しいスレッド立ててしまいました.
ご迷惑をおかけしてしまいましたら,申し訳ございません.

質問なのですが,
VB.NET(2005)でXMLから属性を検索してその属性の親ノードを取得したいと考えております.
そこで簡単な例題として下記のXMLデータで,isbnの番号を指定してその属性のタグを
取得したいと考えております.しかしisbnの番号を指定してもbookという要素タグを
取得できません.ただisbnの番号を一桁の数字だと取得できます.
 また属性タグは要素タグの子ノードではないが,属性タグの親ノードは属性タグと
いうことなのでNode_Pare = node.ParentNode(属性ノード)にして取得しようとしても
うまくいきません.
 最後に,自分が理想として考えているのが,isbnの番号をたとえば
Dim isbn_num As String ="A001"などと指定して,ロケーションパス指定のところで
("/Books/book[@isbn = isbn_num]")などのようにできればいいかなと思っているのでが
何かいい方法をご存じではないでしょうか?
自分で作ってみたプログラムも載せておきます.

お手数ですが,よろしくお願いします.

/* XMLデータ*/
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Books>
<book isbn = "A000">
<title>.Net練習0</title>
</book>
<book isbn = "A001">
<title>.Net練習1</title>
</book>
<book isbn = "A002">
<title>.Net練習2</title>
</book>
<book isbn = "A003">
<title>.Net練習3</title>
</book>
</Books>

/* プログラム */
Dim list As System.Xml.XmlNodeList =
          doc.SelectNodes("/Books/book[@isbn = 'A01']")
Dim node, node_Pare As System.Xml.XmlNode

For Each node In list
TextBox1.Text = node.Attributes("isbn").Value
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-12-31 18:11
引用:

タガさんの書き込み (2006-12-29 16:34) より:
"/Books/book[@isbn = 'A01']"


文字列のくくりをシングルクォーテーションではなくダブルクォーテーションにしたらどうだろう?
コード:
"/Books/book[@isbn = 'A01']"
↓
"/Books/book[@isbn = ¥"A01¥"]"
¥は半角で打ち込んでね。



これでだめなら、contains関数を使用したらどうだろう?
コード:
"/Books/book[countains(@isbn, 'A01')]"



もしくは@isbnを型変換したらどうだろう?
コード:
"/Books/book[string(@isbn) = 'A01']"



この辺、組み合わせて、いろいろやってみて。

引用:

 最後に,自分が理想として考えているのが,isbnの番号をたとえば
Dim isbn_num As String ="A001"などと指定して,ロケーションパス指定のところで
("/Books/book[@isbn = isbn_num]")などのようにできればいいかなと思っているのでが
何かいい方法をご存じではないでしょうか?


XPATHは変数を扱うことができたような気がするけど、この変数をMSXMLにどうやって教えてあげるのか私には分かりません。

代替案として、.net framework下での開発ということなので、
System.String#Format()で整形してはいかが?

ちなみに、
引用:

"/Books/book[string(@isbn) = 'A01']"


において、A001ではなくA01となっているのは、記載ミスということでOK
重箱の隅つつきと思うかもしれないけど、結構こうゆう単純なことで引っかかることとがよくあるので。
タガ
会議室デビュー日: 2006/10/20
投稿数: 5
投稿日時: 2007-01-03 11:56
かずさん,ご返答ありがとうございます.
そして返答が遅くなってしまい,申し訳ございません.

早速試してみたところ,1)だとエラーが起こり,2)ではきちんと
ノードを拾ってくれませんでした.
ですが,3)だときちんと目的のノードを取得することができました.
ありがとうございます.

1)"/Books/book[@isbn = ¥"A01¥"]"

2)"/Books/book[countains(@isbn, 'A01')]"

3)"/Books/book[string(@isbn) = 'A01']"


>System.String#Format()で整形
ですか・・・,どうやっていいのかわからないので,
ちょっと調べてみたいと思います.
アドバイスありがとうございます(^^

>"/Books/book[string(@isbn) = 'A01']"
そうです(><).
そうですよね,こういう些細なミスに何時間も費やすことがありますよね.


いろいろとご指摘ありがとうございます.
とても助かりました.
1

スキルアップ/キャリアアップ(JOB@IT)