
こんにちは
ある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も見ています
-
VBAでXMLを出力するプログラムを作成する際の名前空間接頭辞の付与の仕方について
Visual Basic(VBA)
-
XMLファイル内のデータ(値)を変更するには?
XML
-
あるノードリストに、特定の名前のノードが存在するかどうか調べたい
XML
-
-
4
VBAでXML文書のある特定タグ以下の内容をそのまま取得したい
XML
-
5
ExcelのVBAで、XMLファイルのデータ抽出
Excel(エクセル)
-
6
Excel-VBAでXMLの複数ノードの取り出し
Visual Basic(VBA)
-
7
郵便番号検索APIにてget ElementByTagNameでうまくを取得できない
Visual Basic(VBA)
-
8
vbaでxmlからNodeListでデータがない時、空欄で取得する方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XPathで途中に名前空間が設定さ...
-
XML文のid属性とclass属性について
-
VBAでXML文書のある特定タグ以...
-
XML、XSLTの適応エラー(IEから...
-
XML同じ名前の要素を自動で集約...
-
excelにてweb関数を使い、webデ...
-
データ構造について構造体を使...
-
東芝のDynabookなのですがアン...
-
昔Winnyってありましたけど、あ...
-
XML
-
xmlはどんな用途で使われている
-
最長経路探索
-
xmlのテキストにリンクを張りた...
-
SNMP リンクダウンとノードダ...
-
head要素
-
XSLで、XMLの空タグを制御したい。
-
計算問題が分かりません… どな...
-
C# TreeView 効率良いノード追...
-
CPUの考え方を教えてください ...
-
XMLデータを整形して、ブラウザ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XPathで途中に名前空間が設定さ...
-
VBAでXMLを出力するプログラム...
-
XMLファイル内のデータ(値)を変...
-
VBAでXML文書のある特定タグ以...
-
VB6でXMLを作成しているのです...
-
XMLの要素の内容の中に要素
-
C#でXMLファイルの情報にアクセ...
-
xmlでコンテンツを複数表示させ...
-
LoadCML
-
C# もしくはVB
-
指定した属性値を持つ要素に追...
-
XMLをエクセルに取り込むマクロ...
-
XMLDocumentでスキーマを無視し...
-
XPATHについての質問です。以下...
-
XMLをXSLTで変換するとき、XML...
-
C# GetElementsByTagNameで取得...
-
C#でXMLの読み取り書き取りにつ...
-
XML文のid属性とclass属性について
-
CPUの考え方を教えてください ...
-
東芝のDynabookなのですがアン...
おすすめ情報