XMLの部分タグをExcelへ抽出する方法を教えて下さい。

解決


XML初心者  2004-01-13 00:00:18  No: 81398

XMLの情報をExcelへ落とし込むマクロを作成しているのですが、
下記のように、大タグが二つ存在して、「test2」だけを
抽出する場合はどのようにすればいいのでしょうか?

<xml  test1>
 <Schema   >←データ項目情報
 <DATA     >←実データ
</xml>

<xml  test2>
 <Schema   >
 <DATA     >
</xml>

ちなみに参照設定は、
Dim aaa As New MSXML.XMLHTTPRequest  っと
しなければ駄目みたいなんですね?
ADODB.Recordsetではできないのでしょうか?

なにぶん初心者なもので、出来ればソースをいただけますと幸いのですが、
いかがでしょうか?

宜しくお願いします。


魔界の仮面弁士  2004-01-13 00:48:49  No: 81399

そもそも、上記はXMLファイル構造になっていませんよね。
まずは、正しいXML形式にするのが先決だと思いますよ。

・ルートノードが2つある。
・属性名test1やtest2の後に、等号記号が無い。
・SchemaノードやDATAノードが閉じられていない。

> 大タグが二つ存在して、「test2」だけを抽出する場合は
いろいろな方法がありますが、MSXML3以上を利用するのであれば、
SelectSingleNodeメソッドにXPathを指定して、該当するノードを
取得するのが楽だと思います。

> Dim aaa As New MSXML.XMLHTTPRequest  っと
XMLHTTPRequest ……ですか? DOMDocumentではなく?
いずれにしも、MSXMLは旧式のライブラリなので、あまりお奨めできません。
最新のMSXML4(Service Pack2)を使った方が良いのではないでしょうか。

> ADODB.Recordsetではできないのでしょうか?
Recordsetオブジェクトで読み込み可能なXML形式は、Recordsetの
Saveメソッド(adPersistXML指定時)で保存される形式の物に限られます。


XML初心者  2004-01-13 01:57:16  No: 81400

魔界の仮面弁士さん

ご丁寧なご説明ありがとう御座います。

>そもそも、上記はXMLファイル構造になっていませんよね。
>まずは、正しいXML形式にするのが先決だと思いますよ。
はい。実は、このXMLはあるシステムからXML形式で吐き出された
データでして、直接システムと連結されたXMLをいじくることは出来ないのです。
ですので、この形式からデータを加工せざるをえないのです。(T_T)

MSXMLですが、了解しました。環境を変えてやってみますね。

あと、Recordsetオブジェクトでの読み込みですが、試してみたところ、
読み込む事は可能でした。後は、「TEST2」のタグだけを抽出するメソッドを
指定すれば、問題は解決しそうなので、引き続きこのオブジェクトで
やってみようと思うのですが、次のタグへ移るようなルーチンを
ご存知でしょうか?


魔界の仮面弁士  2004-01-13 03:17:36  No: 81401

> XML形式で吐き出されたデータでして
いや……そもそも、提示されたデータ自体が「XML形式」になっていませんよね?(^_^;)
Well-Formed になっていない以上、それはXML形式ではありません。

今回、掲示板に記述した内容が間違っているというわけではなく、
「あるシステム」から、本当にその形式で吐き出されているのでしょうか。

もし、妥当なXML(Valid XML)どころか、整形式のXML(well-Formed XML)にさえ
なっていないのであれば、XMLパーサ等での読み書きは不可能となります。
その場合は、自分でファイルの解析を行うしかありません。

例えば——提示されたXMLデータが、もしも

 <rootNode>
   <item type="test1">
     <Schema>Schema 1</Schema>
     <DATA>Data 1</DATA>
   </item>
   <item type="test2">
     <Schema>Schema 2</Schema>
     <DATA>Data 2</DATA>
   </item>
 </rootNode>

という形式のXMLであったならば、これは正しいXML形式と言えますので、MSXML4 を使って

  Set N1 = objDOMDocument.selectSingleNode("/rootNode/item[@type='test1']")

のようにして取得出来ます。しかし、最初に提示された形式のままだとしたら、
XMLDocumentに読み込ませる時点で、エラーが発生してしまうでしょう。

> ですので、この形式からデータを加工せざるをえないのです。(T_T)
元データが整形式XMLになっているなら、XSLTで変換するのが良いでしょう。

> 次のタグへ移るようなルーチンをご存知でしょうか?
この場合の『次のタグ』とは、どのような意味でしょうか?

上記の selectSingleNode のコードで言うならば、
  Set N2 = N1.nextSibling
とすれば、『<item type="test2">〜</item>』のノードが取得出来ますし、
  Set N2 = N1.firstChild
とすれば、『<Schema>Schema 1</Schema>』のノードが取得出来ます。

あるいは、selectNodesメソッドを使って、ノードリストを得るという手もあるかと。


XML初心者  2004-01-13 05:55:40  No: 81402

>Well-Formed になっていない以上、それはXML形式ではありません。
え!(^_^;)そうなんですか?

>「あるシステム」から、本当にその形式で吐き出されているのでしょうか。
はい。本当にこのような形式なんです。(^_^;)

<Report output>
 <xml resultname=test1>
  <schema>schema1</schema>
   <DATA>Data 1</DATA>
 </xml>
 <xml resultname=test2>
  <schema>schema1</schema>
   <DATA>Data 1</DATA>
 </xml>
</Report output>

っということは、MSXML4でも思うように対応出来ないのかもしれませんね。

(だから、やたらとエラーが出ていたのか…)

了解しました。自分でなんとか対処してみます。
(方法は変えても結果を出せばいいですので。)

魔界の仮面弁士さん。
とても、わかりやすく詳細なご返答ありがとうございました。

今後も不明なことが生じましたらぜひ、その際はよろしくお願い
いたします。

ありがとうございました。


魔界の仮面弁士  2004-01-13 07:22:13  No: 81403

>> Well-Formed になっていない以上、それはXML形式ではありません。
> え!(^_^;)そうなんですか?
実はそうなのです。
全てのXMLは、Well-Formed(整形式)でなければならない、という決まりがあります。

> <Report output>
> </Report output>
空白文字を含んだ要素名は使えません。[output]部分を属性と見なして、
 <Report output="output">
 </Report>
と書く事ならば可能です。

> <xml resultname=test1>
MSXMLでは、「XML」で始まる名前も利用できてしまいますが、実際には好ましくありません。
また、属性値は「"」で囲まなければなりません。
つまり、「resultname=test1」ではなく、「resultname="test1"」です。

http://www.atmarkit.co.jp/fxml/rensai2/xmlmaster04/master04.html
http://www.atmarkit.co.jp/fxml/askxmlexpert/011tagname/11tagname.html

> っということは、MSXML4でも思うように対応出来ないのかもしれませんね。
その形式だと、XMLパーサでの対応はできない事になりますね。残念ながら…。(/_;)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加