XMLの情報をExcelへ落とし込むマクロを作成しているのですが、
下記のように、大タグが二つ存在して、「test2」だけを
抽出する場合はどのようにすればいいのでしょうか?
<xml test1>
<Schema >←データ項目情報
<DATA >←実データ
</xml>
<xml test2>
<Schema >
<DATA >
</xml>
ちなみに参照設定は、
Dim aaa As New MSXML.XMLHTTPRequest っと
しなければ駄目みたいなんですね?
ADODB.Recordsetではできないのでしょうか?
なにぶん初心者なもので、出来ればソースをいただけますと幸いのですが、
いかがでしょうか?
宜しくお願いします。
そもそも、上記は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ファイル構造になっていませんよね。
>まずは、正しいXML形式にするのが先決だと思いますよ。
はい。実は、このXMLはあるシステムからXML形式で吐き出された
データでして、直接システムと連結されたXMLをいじくることは出来ないのです。
ですので、この形式からデータを加工せざるをえないのです。(T_T)
MSXMLですが、了解しました。環境を変えてやってみますね。
あと、Recordsetオブジェクトでの読み込みですが、試してみたところ、
読み込む事は可能でした。後は、「TEST2」のタグだけを抽出するメソッドを
指定すれば、問題は解決しそうなので、引き続きこのオブジェクトで
やってみようと思うのですが、次のタグへ移るようなルーチンを
ご存知でしょうか?
> 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メソッドを使って、ノードリストを得るという手もあるかと。
>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でも思うように対応出来ないのかもしれませんね。
(だから、やたらとエラーが出ていたのか…)
了解しました。自分でなんとか対処してみます。
(方法は変えても結果を出せばいいですので。)
魔界の仮面弁士さん。
とても、わかりやすく詳細なご返答ありがとうございました。
今後も不明なことが生じましたらぜひ、その際はよろしくお願い
いたします。
ありがとうございました。
>> 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パーサでの対応はできない事になりますね。残念ながら…。(/_;)
ツイート | ![]() |