- PR -

MSXMLでデフォルト名前空間を取り扱う方法

投稿者投稿内容
うえだ
ベテラン
会議室デビュー日: 2006/01/21
投稿数: 52
投稿日時: 2006-05-19 10:44
同じようなことで悩んでいます。
私の場合、C++ではなくて、javascriptなのですが

<script type="text/javascript">
<!--
var xmlDoc
xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async = false
var xmlRoot = xmlDoc.getElementsByTagName("root")

でrootの名前空間は取ってこれるのですが、xmlns="foo"が取ってこれません。
解決策のヒントは無いでしょうか?
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-05-19 11:40
ProgIDとMSXMLのバージョンについて、現時点で調べが付いている部分のメモ。
http://www.hawk.34sp.com/stdpls/xml/js_xml.html

MSXML 3.0 では、以前のバージョンとの互換性を保つために、selectNodes メソッドが使用する文字列はデフォルトでは XPath ではなく、XSLPattern となっています。要素の検索を行うための簡単な指定なら、XPath と XSLPattern に違いはありません。より複雑な検索を行ったり、要素以外のノードを検索する場合は XPath を用いる必要がでてきます。パターン指定を変更するためのメソッド setProperty は、IXMLDOMDocument のメンバではなく、IXMLDOMDocument2 のメンバな
http://www.utj.co.jp/xml/dev/dom/dxdom2_1.html

ですから、setProperty で 名前空間URIに プリフィックスを付けて XPathを使うなどでは
どうですか?

xmlObj.setProperty("SelectionLanguage", "XPath"); はどうかな、古い?
============================================
検索語を
namespace ActiveXObject("Microsoft.XMLDOM")
にすると 出ますね

で、<dc:subject>はDOM2(たとえばMoz)では名前空間用のgetElementsByTagNameNSでないと取り出せません。ただし、IEは逆にgetElementsByTagNameNSを使えないのでクロスブラウザ処理が必要になります。。。またかよ。
http://jsgt.org/mt/archives/01/000052.htm

getElementsByTagNameNS も Msxml2. にしたら使えませんか?
-------------- おまけ
ajax - Content-Type: 許容判定
http://www.kawa.net/works/ajax/tips/mimetype/content-type.html

[ メッセージ編集済み 編集者: MMX 編集日時 2006-05-19 11:56 ]
縞芋
会議室デビュー日: 2005/08/03
投稿数: 9
投稿日時: 2006-08-10 10:40
大分遅くなりましたが、備忘録も兼ねて
調査の結果の報告をしたいと思います。

結論として、デフォルト名前空間を使った場合
MSXMLのgetElementsByTagNameでは
ノードを取得する事は出来なさそうですね。

MSDNのgetElementsByTagNameの仕様に
名前空間はサポートしてないからselectNodesを使えと書いてありました(・_・;
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/8f12949f-9c85-4a9f-b4c8-c64bd7c211ee.asp

CreateInstanceのIDをCLSID_DOMDocument30にした時に
なぜgetElementsByTagNameでノードが取得できたのは
今いち分かりませんでしたが…。

似たような問題にぶつかる人も結構居そうな気がするんですが、
わざわざXPath使って指定しないといけないって言うのも
何か今いち納得が行かないというか、
何の為のgetElementsByTagNameなんだろうと、
ふと疑問に思ってしまいます。
うぅむ…。

という事で、以上、調査報告といたします。
MMXさん、気長に付き合って頂き、
本当にありがとうございました!
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-08-11 14:14
>CreateInstanceのIDをCLSID_DOMDocument30にした時に
なぜgetElementsByTagNameでノードが取得できたのは
今いち分かりませんでしたが…。
既出では:
MSXML 3.0 では、以前のバージョンとの互換性を保つために、
selectNodes メソッドが使用する文字列はデフォルトでは
XPath ではなく、XSLPattern(MSの旧実装、廃止) となっています。

msxmlには、getElementsByTagNameNS(名前空間対応のもの)は無い
(Java などにはあるらしい)
その代わり、selectNodes を使う方向なのでしょう。

参考
GetElementsByTagName を使うって事は
XML Namespace 以前な XML 文書の処理なのですよ。
http://www.ailight.jp/blog/kazuk/archive/2005/07/07.aspx
======
DOMもSAXも、面倒さが身にしみてきて、いろいろ改良libが出てますが

[ メッセージ編集済み 編集者: MMX 編集日時 2006-08-11 14:19 ]

スキルアップ/キャリアアップ(JOB@IT)