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

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

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

Re[9]: XMLの複数名前空間解決


(過去ログ 101 を表示中)

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

■59858 / inTopicNo.1)  XMLの複数名前空間解決
  
□投稿者/ orihikin (1回)-(2011/06/09(Thu) 13:20:57)

分類:[ASP.NET (VB)] 

VB.net2010professional
VBかなり初心者です
XMLファイル中に名前空間がいくつかあり、その解決方法がわかりません
<XMLdata xmlns:aaa="http://aaaa" xmlns:bbb="http://bbb" xmlns:ccc="http://ccc" xmlns:ddd="http://ddd"
 <aaa:info>
  <bbb:id>
   <ccc:bun>
    <ddd:num ddd:code=100>
     <ddd:name>Tname</ddd:name>
     <ddd:su>12</ddd:su>
    </ccc:bun>
   <ccc:bun>
    <ddd:num ddd:code=20>
     <ddd:name>Tname</ddd:name>
     <ddd:su>1</ddd:su>
    </ccc:bun>
   <ccc:bun>
    <ddd:num ddd:code=120>
     <ddd:name>Tname</ddd:name>
     <ddd:su>13</ddd:su>
    </ccc:bun>
  </bbb:id>
 </aaa:info>
</XMLdata>


個々にXmlNamespaceManagerにて名前解決できるので、現在は一つづつ場所を指定し、値を取得しています
ddd:codeが100,120の場合のみ各ddd:name,ddd:suの値を取得したいのです
宜しくお願いします

引用返信 編集キー/
■59860 / inTopicNo.2)  Re[1]: XMLの複数名前空間解決
□投稿者/ Hongliang (782回)-(2011/06/09(Thu) 13:28:11)
で、現在はどういうコードを書いていて、その上でどういうコードを書ければ理想的なのでしょうか?
// XmlDocument ならやっぱり XPath かなー。
引用返信 編集キー/
■59862 / inTopicNo.3)  Re[2]: XMLの複数名前空間解決
□投稿者/ orihikin (2回)-(2011/06/09(Thu) 13:54:48)
No59860 (Hongliang さん) に返信
> で、現在はどういうコードを書いていて、その上でどういうコードを書ければ理想的なのでしょうか?
> // XmlDocument ならやっぱり XPath かなー。
Dim nsmgraa As XmlNamespaceManager = New XmlNamespaceManager(document.NameTable)
nsmgraa.AddNamespace("aaa", "http://aaaa"")
Dim nsmgrbb As XmlNamespaceManager = New XmlNamespaceManager(document.NameTable)
nsmgrbb.AddNamespace("bbb", "http://bbb")
Dim nsmgrcc As XmlNamespaceManager = New XmlNamespaceManager(document.NameTable)
nsmgrcc.AddNamespace("ccc", "http://ccc")

Dim tccc As XmlNodeList = rootElement.GetElementsByTagName("ccc", claim)
Dim Pname As XmlNodeList = tccc(0).SelectNodes("/ddd:name", nsmgrdd)
dim Aname as string =Pname.Item(0)
Dim Psu As XmlNodeList = tccc(0).SelectNodes("/ddd:su", nsmgrdd)
dim Asu as string =Psu.Item(0)
このような感じです

下記のようなコードができないのでしょうか?(文法は適当です)
Dim Pname As XmlNodeList = aaa(0).SelectNodes("/XMLData/aaa:info/bbb:id/ccc:bun", ????)
一つ目名前=Pname(0).name
一つ目数=Pname(0).su


<ccc:bun>の数がその都度変わります

引用返信 編集キー/
■59863 / inTopicNo.4)  Re[3]: XMLの複数名前空間解決
□投稿者/ Hongliang (783回)-(2011/06/09(Thu) 14:09:55)
惜しい……。

XmlNamespaceManager は、XML名前空間と名前空間接頭辞の組み合わせ「のコレクション」を管理します。
ですので、わざわざ XML名前空間ごとに XmlNamespaceManager を New するのではなく、一つの XmlNamespaceManager を作って、そこにすべての組み合わせを AddNamespace するようにしてください。
その XmlNamespaceManager を SelectNodes に渡せばお望み通りに検索できます。

// 「ddd:codeが100,120の場合のみ」みたいな条件も XPath にまとめた方が見通しがいいような。
引用返信 編集キー/
■59864 / inTopicNo.5)  Re[4]: XMLの複数名前空間解決
□投稿者/ orihikin (3回)-(2011/06/09(Thu) 14:22:44)
No59863 (Hongliang さん) に返信
> 惜しい……。
>
> XmlNamespaceManager は、XML名前空間と名前空間接頭辞の組み合わせ「のコレクション」を管理します。
> ですので、わざわざ XML名前空間ごとに XmlNamespaceManager を New するのではなく、一つの XmlNamespaceManager を作って、そこにすべての組み合わせを AddNamespace するようにしてください。
> その XmlNamespaceManager を SelectNodes に渡せばお望み通りに検索できます。


Dim nsmgrall As XmlNamespaceManager = New XmlNamespaceManager(document.NameTable)
nsmgrall.AddNamespace("aaa", "http://aaaa"")
nsmgrall.AddNamespace("bbb", "http://bbb")
nsmgrall.AddNamespace("ccc", "http://ccc")
Dim Pname As XmlNodeList = aaa(0).SelectNodes("/XMLData/aaa:info/bbb:id/ccc:bun", nsmgrall)
こんな感じでしょうか?

>
> // 「ddd:codeが100,120の場合のみ」みたいな条件も XPath にまとめた方が見通しがいいような。
Dim Pname As XmlNodeList = aaa(0).SelectNodes("/XMLData/aaa:info/bbb:id/ccc:bun/ddd:num [@ddd:code='100' or '120']", nsmgrall)
こうですか?
引用返信 編集キー/
■59944 / inTopicNo.6)  Re[5]: XMLの複数名前空間解決
□投稿者/ orihikin (4回)-(2011/06/13(Mon) 16:56:38)
No59864 (orihikin さん) に返信
> ■No59863 (Hongliang さん) に返信

>>// 「ddd:codeが100,120の場合のみ」みたいな条件も XPath にまとめた方が見通しがいいような。
> Dim Pname As XmlNodeList = aaa(0).SelectNodes("/XMLData/aaa:info/bbb:id/ccc:bun/ddd:num [@ddd:code='100' or '120']", nsmgrall)
> こうですか?
上記がうまく出来ません
引用返信 編集キー/
■59948 / inTopicNo.7)  Re[6]: XMLの複数名前空間解決
□投稿者/ Hongliang (785回)-(2011/06/13(Mon) 18:28:51)
「うまくできない」とは?
// というか突然出てきた aaa(0) って何?
引用返信 編集キー/
■59996 / inTopicNo.8)  Re[7]: XMLの複数名前空間解決
□投稿者/ orihikin (5回)-(2011/06/15(Wed) 10:34:51)
No59948 (Hongliang さん) に返信
> 「うまくできない」とは?
orを使わず一つの条件であれば求めている結果が出るのですが、orの使い方がわからないのです
> // というか突然出てきた aaa(0) って何?
すいません aaaはnodelistです
引用返信 編集キー/
■59997 / inTopicNo.9)  Re[8]: XMLの複数名前空間解決
□投稿者/ Hongliang (786回)-(2011/06/15(Wed) 10:57:47)
ああ、
> @ddd:code='100' or '120'
これですか。
VB で、変数 a に入ってるのが 100 または 120 であるという If 文を書くのに、
If a = 100 Or 120 Then
とは書きませんよね? XPath でも同じことです。
引用返信 編集キー/
■59998 / inTopicNo.10)  Re[8]: XMLの複数名前空間解決
□投稿者/ 魔界の仮面弁士 (2222回)-(2011/06/15(Wed) 11:16:03)
No59996 (orihikin さん) に返信
> orを使わず一つの条件であれば求めている結果が出るのですが、orの使い方がわからないのです

述部の指定が
 ddd:num[@ddd:code='100' or '120']
になっていますよね。

これだと
 ddd:num[@ddd:code='100' or boolean('120')]
の意味に解釈されるため、結果として
 ddd:num[@ddd:code='100' or true()]
として扱われる事になり、最終的には
 ddd:num
の意味になってしまうと思われます。

やりたいことはおそらく、
 ddd:num[@ddd:code='100' or @ddd:code='120']
ではないでしょうか?

引用返信 編集キー/
■59999 / inTopicNo.11)  Re[9]: XMLの複数名前空間解決
□投稿者/ orihikin (6回)-(2011/06/15(Wed) 11:21:05)
No59997 (Hongliang さん) に返信
> ああ、
>>@ddd:code='100' or '120'
> これですか。
> VB で、変数 a に入ってるのが 100 または 120 であるという If 文を書くのに、
> If a = 100 Or 120 Then
> とは書きませんよね? XPath でも同じことです。
すいません。
[@ddd:code='100' or @ddd:code='120']
ですね!
解決しました
いろいろと有難う御座いました
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -