こんにちは
ある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で質問しましょう!
似たような質問が見つかりました
- HTML・CSS 疑似要素で背景画像に指定したSVG画像の色変更 2 2023/01/30 22:45
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- Word(ワード) エクセル→ワード差し込み印刷 1 2022/10/05 17:32
- PHP php エラー 3 2022/11/18 23:32
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- アプリ Android studio 初心者 Hello Android!しか表示されない 1 2023/08/01 08:47
- XML XML同じ名前の要素を自動で集約するツール 1 2022/04/11 09:21
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
VBでXMLファイルを作ると xmlns= が・・・
Visual Basic(VBA)
-
Excel-VBAでXMLの複数ノードの取り出し
Visual Basic(VBA)
-
VBA でxmlの全要素・属性の読み込み
Visual Basic(VBA)
-
-
4
VBAでXMLを出力するプログラムを作成する際の名前空間接頭辞の付与の仕方について
Visual Basic(VBA)
-
5
XML文書の指定した属性値を持つノードを取得したい
XML
-
6
XMLファイル内のデータ(値)を変更するには?
XML
-
7
XMLのタグ名の禁則文字
XML
-
8
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
9
xmlファイル内の文字列置換
Visual Basic(VBA)
-
10
VBAでXML文書のある特定タグ以下の内容をそのまま取得したい
XML
-
11
VBSでxmlの値を書き換えたい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XMLファイル内のデータ(値)を変...
-
VBAでXML文書のある特定タグ以...
-
CPUの考え方を教えてください ...
-
XMLで要素が記述された順番に意...
-
東芝のDynabookなのですがアン...
-
昔Winnyってありましたけど、あ...
-
ルート要素ノードが2個ある場合?
-
コンテキストメニュークリック...
-
タグの有無の判定
-
MSXMLを使ってノードを削除した...
-
Global.asaxでクラスを宣言?
-
特殊記号が勝手にエスケープさ...
-
XMLを出力する時のエラー原因
-
UTF-8でエンコーディングとはど...
-
TreeViewに重複する値をセット
-
DTDファイルをクラスパスから読...
-
TreeViewについて
-
xmlのテキストにリンクを張りた...
-
XML、XSLTの適応エラー(IEから...
-
isnan・isnf関数が「識別子が見...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XMLファイル内のデータ(値)を変...
-
XPathで途中に名前空間が設定さ...
-
VB6でXMLを作成しているのです...
-
VBAでXMLを出力するプログラム...
-
VBAでXML文書のある特定タグ以...
-
XMLDocumentでスキーマを無視し...
-
WebBrowser1.Document.Body.Inn...
-
XMLの要素の内容の中に要素
-
エクセルVBA ウェブ上のボタ...
-
XMLをエクセルに取り込むマクロ...
-
C# GetElementsByTagNameで取得...
-
東芝のDynabookなのですがアン...
-
CPUの考え方を教えてください ...
-
XMLで要素が記述された順番に意...
-
昔Winnyってありましたけど、あ...
-
バッチファイルでテキストファ...
-
XML、XSLTの適応エラー(IEから...
-
UTF-8でエンコーディングとはど...
-
SNMP リンクダウンとノードダ...
-
ルート要素ノードが2個ある場合?
おすすめ情報