
こんにちは
ある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
No.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 を書いてください。
ありがとうございます!
名前空間や接頭辞を入れてXPathを書いていたのですがなかなかうまくいかずに困っていました。XMLのオブジェクト自体に設定を追加しなければならないんですね。読み込んだ時点で自動的に名前空間が認識されているのだと勘違いしていました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
VBAでXMLを出力するプログラムを作成する際の名前空間接頭辞の付与の仕方について
Visual Basic(VBA)
-
Excel-VBAでXMLの複数ノードの取り出し
Visual Basic(VBA)
-
郵便番号検索APIにてget ElementByTagNameでうまくを取得できない
Visual Basic(VBA)
-
-
4
XMLでのAttributeを持ったNodeの追加方法
Visual Basic(VBA)
-
5
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
6
VBAでXML文書のある特定タグ以下の内容をそのまま取得したい
XML
-
7
ExcelのVBAで、XMLファイルのデータ抽出
Excel(エクセル)
-
8
vba 空のデータをSplitする時の処理について教えてください
Microsoft ASP
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XMLを作成してもタグしか表示さ...
-
dataファイルをxtxファイルにす...
-
ChatGPT excel
-
ray-mmdについて
-
MSFormsとは何ですか?
-
ヤフー知恵袋みたいなサイトを...
-
Windowsで見かけるxmlファイル...
-
reaper音声ファイルについて
-
スマホのスプレッドシートでセ...
-
XMLサイトマップの登録方法がわ...
-
タモリさんを信じられますか?
-
自分のHTMLサイトでRSSを読み込...
-
ゲーミングPCに入っているAlris...
-
【BAT(バッチ)ファイル】Web...
-
XMLとは何ですか?
-
特殊文字の検索方法
-
フォルダー内検索
-
公文書のxmlファイルの開き方が...
-
Webページに関するさまざまな情...
-
head要素
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XPathで途中に名前空間が設定さ...
-
XML文のid属性とclass属性について
-
XMLファイル内のデータ(値)を変...
-
VBAでXMLを出力するプログラム...
-
ホームページ作成 アンカーと...
-
VBSでのDOM操作について
-
VB6でXMLを作成しているのです...
-
XMLDocumentでスキーマを無視し...
-
エクセルVBA ウェブ上のボタ...
-
VBAでXML文書のある特定タグ以...
-
CPUの考え方を教えてください ...
-
ルート要素ノードが2個ある場合?
-
SNMP リンクダウンとノードダ...
-
東芝のDynabookなのですがアン...
-
XMLで要素が記述された順番に意...
-
XML、XSLTの適応エラー(IEから...
-
C#でTreeViewのCheckBoxのサイ...
-
xmlファイルが上手にHTMLに変換...
-
昔Winnyってありましたけど、あ...
-
バッチファイルでテキストファ...
おすすめ情報