XMLをエクセルで取り込み、表にしたいと考えています。
エクセル2003にて下記のtest.xmlをインポートすると

<?xml version="1.0" encoding="UTF-8" ?>
<McXMLRoot>
<McXMLData>
<McXMLPageData>
<ヘッダ情報>
<作成日>
<value>平成21年 5月28日</value>
</作成日>
<作成時間>
<value>10時55分12秒</value>
</作成時間>
<ページ数>
<value>0001</value>
</ページ数>
</ヘッダ情報>
<明細情報>
<商品名>
<value>パソコン</value>
</商品名>
<価格>
<value>100000</value>
</価格>
</明細情報>
<明細情報>
<商品名>
<value>プリンタ</value>
</商品名>
<価格>
<value>20000</value>
</価格>
</明細情報>
</McXMLPageData>
</McXMLData>
</McXMLRoot>

エクセルでタイトルがvalue,value2…,value5 のように表示されます。
作成日,作成時間,ページ数,商品名,価格
のように表示するためのマクロを作成しようとしているのですが、

Public Const XmlPass = "D:\WORK\test.xml"
Public Sub Auto_Open()
ActiveWorkbook.XmlImport URL:=XmlPass _
, ImportMap:=Nothing, Overwrite:=True, Destination:=Range("$A$1")
End Sub

で取り込んだあと、どのように処理すればよいのでしょうか?
(1)テキストとして読み込む
(2)<value>のすぐ前にあるタイトル部分を検索
(3)タイトル部分を切り出す。
(4)指定のセルにタイトルをセット

とすると、切り出したタイトルの文字コードがUTF-8のため
文字化けしてしまいます。

Private Sub setTitle()
Dim FileNoRead%
Dim wkFree$
Dim result1 As Integer
Dim result2 As Integer
Dim result3 As Integer
Dim Title(300) As String
Dim Soeji As Integer
Dim Kaishi As Integer
Dim SWork As String

Soeji = 0
Kaishi = 1

FileNoRead% = FreeFile
' テキストのオープン
Open XmlPass For Input Access Read As #FileNoRead%

' テキストの読込
Line Input #FileNoRead%, wkFree$ 'ファイルから1行読み込む

' テキストのクローズ
Close #FileNoRead%

Do While True
Soeji = Soeji + 1
result1 = InStr(Kaishi, wkFree$, "<value>") '<value>出現位置
result2 = InStrRev(wkFree$, ">", result1) + 1 'タイトル終了位置
result3 = InStrRev(wkFree$, "<", result2) + 1 'タイトル開始位置
SWork = Mid(wkFree$, result3, (result1 - result2))

Title(Soeji) = SWork
Kaishi = InStr(result1, wkFree$, "</value>") '</value>出現位置
Kaishi = Kaishi + 8
Loop

End Sub


ほかに何かよい方法があったら教えてください。

P.S)作りはじめのため、バグ多数存在します。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

「このとき<明細情報>はセットできますが、<ヘッダ情報>はどのようにセットするのでしょうか?」


No2です。<ヘッダ情報>がセットされないのは、
Set nlist = ObjXml.selectNodes("//明細情報/*")
で、<明細情報>以下の要素しかnlistに入れてないからです。
<ヘッダ情報>以下をnlistにセットするなら、
Set nlist = ObjXml.selectNodes("//ヘッダ情報/*")
としてXpathで選ぶか、又はルートからたどって
Set nlist = ObjXml.childNodes(1).childNodes(0).childNodes(0).childNodes(0).childNodes
として選ぶか、又はTagName指定で
Set nlist = ObjXml.getElementsByTagName("ヘッダ情報")
Set nlist = nlist(0).childNodes
と選びます。選んだ上で、
For Each node In nlist
msgbox node.nodeName & _
node.childNodes(0).childNodes(0).nodeValue
Next node
として、項目名と内容を取得できます。
「文字コードは勝手に変換してくれてます(本当かな?)」
ヘッダーの項目の数は nlist.Length になります。
    • good
    • 0
この回答へのお礼

ありがとうございました。
勉強になりました。

改良したプログラムで何とかなりました。
ただ、また新たな問題が…

その内容は"XMLをエクセルに取り込むマクロその2"
として新たに投稿したのでよろしければ教えてください

お礼日時:2009/06/03 16:58

>文字コードがUTF-8のため文字化けしてしまいます。


の部分限定だと、ADODB.Streamを介して、UTF-8→Shift JIS等に変換できます。検索していただくとVBAのコードも沢山見つかりますが、一例です。
http://oshiete1.goo.ne.jp/qa1963113.html
    • good
    • 0

もうちょっと丁寧に、ちゃんと動くように書き直しました。


Public Const XmlPass = "D:\WORK\test.xml"
Sub parseXML()
Dim ObjXml As MSXML2.DOMDocument
Set ObjXml = CreateObject("MSXML2.DOMDocument")
If ObjXml.Load(XmlPass) = False Then
Exit Sub
End If
Dim nlist As MSXML2.IXMLDOMNodeList
Dim h_nlist As MSXML2.IXMLDOMNodeList
Set nlist = ObjXml.selectNodes("//明細情報/*")
Dim node As MSXML2.IXMLDOMNode
Dim i As Integer
i = 2
For Each node In nlist
Set h_nlist = ObjXml.getElementsByTagName("作成日")
Cells(i, 1).Value = h_nlist(0).childNodes(0).childNodes(0).nodeValue
Set h_nlist = ObjXml.getElementsByTagName("作成時間")
Cells(i, 2).Value = h_nlist(0).childNodes(0).childNodes(0).nodeValue
Set h_nlist = ObjXml.getElementsByTagName("ページ数")
Cells(i, 3).Value = h_nlist(0).childNodes(0).childNodes(0).nodeValue
If node.nodeName = "商品名" Then
Cells(i, 4).Value = node.childNodes(0).childNodes(0).nodeValue
End If
If node.nodeName = "価格" Then
Cells(i, 5).Value = node.childNodes(0).childNodes(0).nodeValue
i = i + 1
End If
Next node
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
ただ、申し訳ありませんが大事なことを伝えておりませんでした。

取り込むべきXMLの種類は多数あり、タイトルが作成日,作成時間,ページ数,商品名,価格
とは限らないのです。

なのでやはりXMLをインポート後にタイトルセットでないとダメのようです。
そこで以下を考えました。

Private Sub parseXML()
Dim ObjXml As MSXML2.DOMDocument
Set ObjXml = CreateObject("MSXML2.DOMDocument")
If ObjXml.Load(XmlPass) = False Then
Exit Sub
End If
Dim nlist As MSXML2.IXMLDOMNodeList
Dim h_nlist As MSXML2.IXMLDOMNodeList
Set nlist = ObjXml.selectNodes("//明細情報/*")
Dim node As MSXML2.IXMLDOMNode
Dim strWork As String
Dim i As Integer
i = 1
For Each node In nlist
If i = 1 Then '最初のタイトルを退避
strWork = node.nodeName
MsgBox ("最初のタイトル[" & strWork & "]")
Else
MsgBox ("node.nodeName[" & node.nodeName & "]")
If strWork = node.nodeName Then
Exit For
End If
End If
' タイトルセット
Cells(1, i).Value = node.nodeName

i = i + 1
Next node
End Sub

このとき<明細情報>はセットできますが、<ヘッダ情報>はどのようにセットするのでしょうか?
Cells(1, i).Value = ??? を教えてください。
よろしくお願いします。

お礼日時:2009/06/01 11:09

XMLをシートにインポートせずに、マクロVBAでXMLと処理した方が簡単です。

(読み込み元のXML構造が分からないので以下のコードは想像です)
まず、VBEの参照設定で「Microsoft XML v6.0」をチェックします。
Public Const XmlPass = "D:\WORK\test.xml"
sub parseXML()
'XMLのDOMオブジェクトを準備します。
Dim ObjXml As MSXML2.DOMDocument
Set ObjXml = CreateObject("MSXML2.DOMDocument")
'XMLファイルをオブジェクトにロードします。
if(ObjXml.Load(XmlPass) = false ) Then Exit sub
Dim nlist As MSXML2.IXMLDOMNodeList
'ノードリストオブジェクトも準備します。
Set nlist = ObjXml.selectNodes("//明細情報/*")
'Xpathで取得するノードを選びます。
Dim node As MSXML2.IXMLDOMNode
'ノードオブジェクトを準備します
dim i as Integer
i=2
For Each node In nlist
'以下のループで中身を取り出します。
if node.childNodes(0).nodeName = "商品名" then _
cells(i,4).value = node.childNodes(0).childNodes(0).childNodes(0).value
end if
if node.childNodes(0).nodeName = "価格" then _
cells(i,5).value = node.childNodes(0).childNodes(0).childNodes(0).value
end if
i = i + 1
Next node

End Sub
    • good
    • 0
この回答へのお礼

大変申し訳ありません。
大事な部分をお伝えしていませんでした。
回答番号2のお礼を参照し、ご回答いただけないでしょうか?
よろしくお願いします。

お礼日時:2009/06/01 11:13

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcel-VBAでXMLの複数ノードの取り出し

すみません、いつも、いろいろな方に助けて頂いていますが、また、初歩的な質問をさせて頂きます。
Excel2007のVBAでXMLの扱いが良くわかっておりません。
以下のプログラムで複数ItemのASINを出力したいのですが、うまくいきません。
XMLがきちんと取得できているのはWireSharkでキャプチャして確認できております。
VBAで表示出力するのがうまくいきません。ご教授方よろしくお願いします。
selectSingleNodeで一つの場合はうまく取り出せています。複数ノードの場合にSelectNodesの使い方に問題がありますでしょうか?
型の宣言などに誤りがありますでしょうか?

また、基本的なことですが、MSXML2を使おうとしたら、Excel2007で使えませんでした。
XMLDOMは、サポート切れ?で古いので、MSXML2を使うのが良いとWebで見ました。
DLLなどが必要な気がしているのですが、よくわかっていないのでご教授頂きたいです。

すみませんが、よろしくお願いします。

*****VBAプログラム(抜粋)******
Dim xml As Object, xmlItems As Object, objPrice As Object
'XML オブジェクト作成
Set xml = CreateObject("Microsoft.XMLDOM")
xml.async = False
xml.Load URI

Set xmlItems = xml.SelectNodes("ItemLookupResponse/Items/Item")

For Each objPrice In xmlItems
' ASIN
If Not objPrice.SelectSingleNode("ASIN") Is Nothing Then
curWS.Cells(rowIndex, ASINCol) = objPrice.SelectSingleNode("ASIN").text
End If
Next


*****取得したXML(抜粋)******
<ItemSearchResponse >
<Items>
<Item>
<ASIN>111</ASIN>
</Item>
<Item>
<ASIN>222</ASIN>
</Item>
<Item>
<ASIN>333</ASIN>
</Item>
</Items>
</ItemSearchResponse>

すみません、いつも、いろいろな方に助けて頂いていますが、また、初歩的な質問をさせて頂きます。
Excel2007のVBAでXMLの扱いが良くわかっておりません。
以下のプログラムで複数ItemのASINを出力したいのですが、うまくいきません。
XMLがきちんと取得できているのはWireSharkでキャプチャして確認できております。
VBAで表示出力するのがうまくいきません。ご教授方よろしくお願いします。
selectSingleNodeで一つの場合はうまく取り出せています。複数ノードの場合にSelectNodesの使い方に問題がありますでし...続きを読む

Aベストアンサー

とりあえず下記で111,222,333が取得できました。ご参考まで。
当方、Windows7Home64bit/xl2010です。
環境は異なりますが、MSXML3あたりでも動くコードだと思います。
コード中XPATHはItemLookupResponseなのに、テストデータの方はItemSearchResponseになっていますが大丈夫ですか?

'MSXML6に参照設定
Sub test()
Dim XML As New MSXML2.DOMDocument60
Dim xmlItems As IXMLDOMNodeList
Dim objPrice As IXMLDOMNode

XML.async = False
' XML.validateOnParse = False
' XML.resolveExternals = False
' XML.preserveWhiteSpace = True

XML.Load GetDesktopPath & "\test.xml" 'お示しのデータをコピペして保存
Set xmlItems = XML.SelectNodes("ItemSearchResponse/Items/Item")
For Each objPrice In xmlItems
' ASIN
If Not objPrice.SelectSingleNode("ASIN") Is Nothing Then
Debug.Print objPrice.SelectSingleNode("ASIN").Text
End If
Next

'直接ASINまで指定しても良いと思うが...
' Set xmlItems = XML.SelectNodes("ItemSearchResponse/Items/Item/ASIN")
' If xmlItems.Length > 0 Then
' For Each objPrice In xmlItems
' Debug.Print objPrice.Text
' Next
' End If

Set XML = Nothing
End Sub

Private Function GetDesktopPath() As String
Dim wScriptHost As Object, strInitDir As String
Set wScriptHost = CreateObject("Wscript.Shell")
GetDesktopPath = wScriptHost.SpecialFolders("Desktop")
Set wScriptHost = Nothing
End Function

とりあえず下記で111,222,333が取得できました。ご参考まで。
当方、Windows7Home64bit/xl2010です。
環境は異なりますが、MSXML3あたりでも動くコードだと思います。
コード中XPATHはItemLookupResponseなのに、テストデータの方はItemSearchResponseになっていますが大丈夫ですか?

'MSXML6に参照設定
Sub test()
Dim XML As New MSXML2.DOMDocument60
Dim xmlItems As IXMLDOMNodeList
Dim objPrice As IXMLDOMNode

XML.async = False
' XML.validateOnParse = False
' XML.resolv...続きを読む

QVBAでMSXML2.DOMDocument を使用したい

お世話になります。
下記ソースのようにVBAで「MSXML2.DOMDocument」を使用したいと
思うのですが実行すると
「Dim D As MSXML2.DOMDocument」の箇所で
「コンパイルエラー:ユーザ定義型は定義されていません」
とメッセージがでます。

どのようにすれば「MSXML2.DOMDocument」が使えるのでしょうか?
私は、完全な初心者でありました。何も設定せずに、VBAに下記の
文を入力しました。
解決策と、もし、VBAでDOMを使用する初心者サイトがありましたら
教えて頂ければとおもいます。
よろしくお願いします。

VBAソース--------------------------------------------
Dim D As MSXML2.DOMDocument
Set D = New MSXML2.DOMDocument
D.async = False
If D.Load("C:\SAMPLE.XML") Then
MsgBox "読み込み成功"
Else
MsgBox "読み込み失敗"
End If

お世話になります。
下記ソースのようにVBAで「MSXML2.DOMDocument」を使用したいと
思うのですが実行すると
「Dim D As MSXML2.DOMDocument」の箇所で
「コンパイルエラー:ユーザ定義型は定義されていません」
とメッセージがでます。

どのようにすれば「MSXML2.DOMDocument」が使えるのでしょうか?
私は、完全な初心者でありました。何も設定せずに、VBAに下記の
文を入力しました。
解決策と、もし、VBAでDOMを使用する初心者サイトがありましたら
教えて頂ければとおもいます。
よろしくお願い...続きを読む

Aベストアンサー

ツール→参照設定→Microsoft XML v6.0にチェックを入れる

#事前にMS XML 6.0が必要。
#Windows XP SP3にMSXML v6 SP2が含まれるようだ
#特にSPが書かれていないが,MSXML v6 SP2とバージョンが同じらしい。
http://www.microsoft.com/downloads/details.aspx?familyid=59914795-60C7-4EBE-828D-F28CB457E6E3&displaylang=en
オマケ:
http://blogs.msdn.com/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QVBAにてデータが数字か文字かを判定するには

VBAにてデータが数字か文字かを判定するには、
どうすれば良いのでしょうか?

文字数は任意で決まっていません。


123 ← 数字
あい ← 文字
1F  ← 文字
G  ← 文字

Aベストアンサー

こんにちは。

数字か文字かなら、IsNumeric でよいと思いますが、数値か文字かでしたら、VarType を使います。私の場合は、IsNumericは、めったに使いません。VarTypeのほうが多いですね。IsNumeric は、文字通り、文字か数字かで、文字列書式の数字も含まれます。なお、VBAでは、数字は、数値型に型キャストされますので、特に問題は発生しません。

ご参考までに。

Sub Test()
 If VarType(Range("A1").Value) = vbDouble Then
  MsgBox "数値"
 ElseIf VarType(Range("A1").Value) = vbString Then
  MsgBox "文字列"
 Else
  MsgBox "その他" '代表的なものはエラー値です
 End If
End Sub

-----------------------------------------
こちらの場合は、全角数字も、数字として扱われます。

Sub Test2()
 If IsNumeric(Range("A1").Value) Then
   MsgBox "数字"
 Else
   MsgBox "数字ではない"
 End If
End Sub

こんにちは。

数字か文字かなら、IsNumeric でよいと思いますが、数値か文字かでしたら、VarType を使います。私の場合は、IsNumericは、めったに使いません。VarTypeのほうが多いですね。IsNumeric は、文字通り、文字か数字かで、文字列書式の数字も含まれます。なお、VBAでは、数字は、数値型に型キャストされますので、特に問題は発生しません。

ご参考までに。

Sub Test()
 If VarType(Range("A1").Value) = vbDouble Then
  MsgBox "数値"
 ElseIf VarType(Range("A1").Value) = vbString Th...続きを読む

Qエクセル マクロで指定フォルダを開く

エクセルにて
指定フォルダを開く、マクロがあれば教えて頂けないでしょうか。
よろしくお願いいたします。

Aベストアンサー

こんにちは。

こういうものですか?
開くフォルダを変えたいときは targ に与えるパスを変更します。

Sub OpenFolders()
Dim targ As String
targ = "C:\"
Shell "C:\Windows\Explorer.exe " & targ, vbNormalFocus
End Sub

QXMLからデータを取得

いつもお世話になっております。

XMLファイルに含まれたデータの中から、特定のデータを検索するプログラムを作りたいと思っております。

<AAA Name="テスト">
   <BBB x="2" y="2"></BBB>
   <CCC Num="0001"></CCC>
   <CCC Num="0002"></CCC>
</AAA>
XMLデータの形式は↑みたいな感じで、これが100以上あり、CCCタグは0~5個までです。

フォームにテキストボックスを配置し、そこに検索したい語句を入れ、
AAAタグのNameの中身と合致したら、BBB、CCCの属性をすべて取得して表示するということをしたいのですが、
どうにも上手くいきません。

VB2008を使用しております。
方法をご存知の方、ご教授ください……orz

Aベストアンサー

a_navi.Select("//AAA[@Name='test']")
で AAAタグの検索条件を増やさないのであれば

xml_data = a_navi.Select("//AAA[@Name='test']")
while xml_data.MoveNext
  Dim xmldoc As New Xml.XmlDocument
  ' XMLDocumentに 選択されたCurrentのOuterXmlを与えれば
  ' 自前で XML形式の体裁を整える必要がありません
  xmldoc.loadXML( xml_data.Current.OuterXml)
  ' StringReaderにも OuterXmlで与えます
  a_xml = new Xml.XmlTextReader(New IO.StringReader(xml_data.DocumentElement.OuterXml))
  while a_xml.Read
    If a_xml.NodeType = XmlNodeType.Element Then
      Select Case a_xml.LocalName
        ' AAAタグ用の分岐を定義
        Case "AAA"
          Console.WriteLine("aaa:" & a_xml.GetAttribute("age") & "," & a_xml.GetAttribute("id"))
        Case "BBB"
          Console.WriteLine("bbb:" & a_xml.GetAttribute(0) & "," & a_xml.GetAttribute(1))
        Case "CCC"
          Console.WriteLine("ccc:" & a_xml.GetAttribute(0))
      End Select
    End If
  end while
end while

といった具合でよさそうですよ

a_navi.Select("//AAA[@Name='test']")
で AAAタグの検索条件を増やさないのであれば

xml_data = a_navi.Select("//AAA[@Name='test']")
while xml_data.MoveNext
  Dim xmldoc As New Xml.XmlDocument
  ' XMLDocumentに 選択されたCurrentのOuterXmlを与えれば
  ' 自前で XML形式の体裁を整える必要がありません
  xmldoc.loadXML( xml_data.Current.OuterXml)
  ' StringReaderにも OuterXmlで与えます
  a_xml = new Xml.XmlTextReader(New IO.StringReader(xml_data.DocumentElement...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング