- - PR -
MSXMLでデフォルト名前空間を取り扱う方法
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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"が取ってこれません。 解決策のヒントは無いでしょうか? |
|
投稿日時: 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 ] |
|
投稿日時: 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さん、気長に付き合って頂き、 本当にありがとうございました! |
|
投稿日時: 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 ] |