プロが教えるわが家の防犯対策術!

こんにちは

あるXML文書を処理するために、VBAを使ってエクセルに書き出すスクリプトを書いています。
例えば、次のようなXMLファイルがあります。

<?xml version="1.0" encoding="utf-8"?>
<Recordset>
<RecordGroup>
<Record Id="1">
<RecRule xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://myschemas.org/Record.set">
<Description>1番目</Description>
<IgnoreCase>true</IgnoreCase>
</RecRule>
</Record>
<Record Id="2">
<RecRule xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://myschemas.org/Record.set">
<Description>アイディー2</Description>
<IgnoreCase>true</IgnoreCase>
</RecRule>
</Record>
</RecordGroup>
</Recordset>
--ここまで--
VBAで、MSXML2.DOMDocument60を使って読み込み、エクセル上に書き入れているのですが上記のRecRuleの部分に名前空間の定義があり、これが原因でその下のDescriptionを直接指定することができません。例えば、次のようなXPathではNothingが返されます。

Set Record = XML.SelectSingleNode("//Recordset/RecordGroup/Record[@Id='2']/RecRule/Description")

RecRuleに名前空間の定義がない場合や、名前空間ではない普通の属性値の設定であれば上記のXPathで要素が取得できることは確認できています。代替策として、Record[@Id='2']までを取得して、そのChildNodes(0)の~という具合で取得していくことはできるですが、もやもやっとするので解決したいと思っています。

このXML文書のフォーマットを私がかえることはできません。

Excel VBA, Windows 7 64bit

A 回答 (1件)

要素 RecRule とその子孫要素は接頭辞こそ省略されていますが、


れっきとした XML 名前空間が定義されています。

以下の二行は XML 的に同じ意味です。
<RecRule xmlns="foo"><Description>1番目</Description></RecRule>
<r:RecRule xmlns:r="foo"><r:Description>1番目</r:Description></r:RecRule>

そのため XPath にて要素を指定する際は、名前空間も含めて記述する必要があります。
MSXML の場合は SelectionNamespaces のプロパティで指定する様です。
https://msdn.microsoft.com/ja-jp/library/ms75604 …

// サンプル
ns = "xmlns:r='http://myschemas.org/Record.set'";
dom.setProperty("SelectionNamespaces", ns);
record = dom.selectSingleNode("//r:RecRule/r:Description");

どうやら MSXML では接頭辞なしで名前空間を指定する方法がないようなので、
適当な接頭辞を決めて XPath を書いてください。
    • good
    • 1
この回答へのお礼

ありがとうございます!
名前空間や接頭辞を入れてXPathを書いていたのですがなかなかうまくいかずに困っていました。XMLのオブジェクト自体に設定を追加しなければならないんですね。読み込んだ時点で自動的に名前空間が認識されているのだと勘違いしていました。

お礼日時:2015/11/30 10:13

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

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