C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: XML文書のタグにコロンがある時のXPathの使用方法


(過去ログ 87 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■51890 / inTopicNo.1)  XML文書のタグにコロンがある時のXPathの使用方法
  
□投稿者/ tani (7回)-(2010/07/24(Sat) 17:59:29)

分類:[VB.NET/VB2005 以降] 

2010/07/24(Sat) 18:03:37 編集(投稿者)
VB2005を使用しております。

下記のXML文書があり、XPathで「123」というデータを取得したいと思っています。

<?xml version="1.0" encoding="UTF-8"?>
<aa>
  <bb:BB>
    <cc>123</cc>
  </bb:BB>
</aa>


ソースを下記のように記述しました。

Dim xmldoc As New XmlDocument()
xmldoc.Load("c:\test.xml")

Dim list As XmlNodeList = xmldoc.SelectNodes("/aa/bb:BB/cc")

Dim node As XmlNode
For Each node In list
    Console.WriteLine(node.InnerText)
    TextBox1.Text = node.InnerText
Next

実行時、ソースの3行目で引っかかり、
「名前空間マネージャまたはXsltContextが必要です。
 このクエリには、プレフィックス、変数、またはユーザー定義の関数があります。」
とエラーが表示されます。


XML文書の<bb:BB>のタグにコロンが入っていなければ、すんなり処理できるのですが、
XML文書を変更できないので、ソースで対応させたいと思っています。
どのように記述すれば対応できるでしょうか?

引用返信 編集キー/
■51891 / inTopicNo.2)  Re[1]: XML文書のタグにコロンがある時のXPathの使用方法
□投稿者/ Hongliang (676回)-(2010/07/24(Sat) 18:50:43)
bb:BB というタグは、「bb という接頭辞に関連づけられた URI の指す名前空間に属する BB と言う名前の要素」という意味になります。
ここで、「bb という接頭辞に関連づけられた URI の指す名前空間」は、その要素または先祖要素内にて、xmlns:bb="***" という形で宣言されます。*** が名前空間を示す URI で、bb が現在の XML 内でその名前空間のエイリアスとなる名前空間接頭辞です。お挙げになった「下記のXML文書」にも、実際には bb:BB または aa 要素内にこういう名前空間宣言があるはずです。

さて、名前空間接頭辞はその XML 文書内のみで有効であり、XmlDocument は XML を読み取る際に、名前空間接頭辞を名前空間 URI に置き換えて要素を管理します。つまり、例えば <bb:BB xmlns:bb="urn:Hoge"/> という要素であれば、「urn:Hoge という名前空間に属する BB という名前の要素」であり、bb という接頭辞は一旦忘れられます。

XmlDocument 内の特定の名前空間に属する要素を XPath を使って検索する場合、例外メッセージ通り名前空間マネージャ、XmlNamespaceManager を使用します(SelectNodes メソッドなどでは第二引数に渡せます)。
サンプルコードは XmlNode.SelectNodes メソッド (String, XmlNamespaceManager) の例の「各 ISBN 属性の値を表示する例を次に示します。」をご覧下さい。
http://msdn.microsoft.com/ja-jp/library/4bektfx9.aspx
ちなみに、前述の通り bb という接頭辞は一旦忘れられているので、XmlNamespaceManager に AddNamespace する際に必ずしも bb と付けなくとも構いません。urn:Hoge を aa という接頭辞で XmlNamespaceManager に追加し、XPath に //aa:BB などと書くことも可能です。
引用返信 編集キー/
■51892 / inTopicNo.3)  Re[2]: XML文書のタグにコロンがある時のXPathの使用方法
□投稿者/ tani (8回)-(2010/07/24(Sat) 21:01:06)
Hongliang さん

おかげさまで、下記の通りソースを修正して無事に思い通りの処理を完成させることができました。
丁寧なご説明ありがとうございました。

【XML文書】

<Response>
   <header:Header xmlns:header="http://test">
      <Status>Success</Status> 
   </header:Header>
   <Body>
      <genreSearch:GenreSearch xmlns:genreSearch="http://test2">
         <child>
            <genreId>123</genreId> 
            <genreName>商品名</genreName> 
         </child>
      </genreSearch:GenreSearch>
   </Body>
</Response>

【ソース】
Dim xmldoc As New XmlDocument()
xmldoc.Load("C:\test.xml")

Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(xmldoc.NameTable)
nsmgr.AddNamespace("genreSearch", "http://test2")

Dim nodeList As XmlNodeList
Dim root As XmlElement = xmldoc.DocumentElement

nodeList = root.SelectNodes("/Response/Body/genreSearch:GenreSearch/child/genreName", nsmgr)


引用返信 編集キー/
■51893 / inTopicNo.4)  Re[3]: XML文書のタグにコロンがある時のXPathの使用方法
□投稿者/ tani (9回)-(2010/07/24(Sat) 21:01:26)
No51892 (tani さん) に返信
> Hongliang さん
>
> おかげさまで、下記の通りソースを修正して無事に思い通りの処理を完成させることができました。
> 丁寧なご説明ありがとうございました。
>
> 【XML文書】
>
> <Response>
> <header:Header xmlns:header="http://test">
> <Status>Success</Status>
> </header:Header>
> <Body>
> <genreSearch:GenreSearch xmlns:genreSearch="http://test2">
> <child>
> <genreId>123</genreId>
> <genreName>商品名</genreName>
> </child>
> </genreSearch:GenreSearch>
> </Body>
> </Response>
>
> 【ソース】
> Dim xmldoc As New XmlDocument()
> xmldoc.Load("C:\test.xml")
>
> Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(xmldoc.NameTable)
> nsmgr.AddNamespace("genreSearch", "http://test2")
>
> Dim nodeList As XmlNodeList
> Dim root As XmlElement = xmldoc.DocumentElement
>
> nodeList = root.SelectNodes("/Response/Body/genreSearch:GenreSearch/child/genreName", nsmgr)
>
>
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -