- PR -

.NETのSYSTEM.XMLでDOMを使いたいのですが。

1
投稿者投稿内容
ゆき
大ベテラン
会議室デビュー日: 2003/11/02
投稿数: 121
投稿日時: 2003-12-04 00:13
 こんばんわ。
.NETのSYSTEM.XMLで、
Dim domdoc As New XmlDocument
domdoc.Load("c:\ファイル.xml")
domdoc.GetElementsByTagName("a:aTag").Item(0).SelectSingleNode("b:bTag").FirstChild.Value = "AAA"
のようにすると、
「XPathException: 名前空間マネージャまたは XsltContext が必要です。このクエリにはプレフィックス、変数またはユーザー定義の関数があります。」
というエラーが出てしまいます。
名前空間プレフィックスが付いているからだとは思うのですが、
どうやったら値を入れられるのかがわからないです。
どなたかご存知の方はいませんか?

yatcin
会議室デビュー日: 2003/11/21
投稿数: 12
投稿日時: 2003-12-04 19:45
.NETは使ったことがないので憶測です。
プレフィックスではなくて名前空間に展開したらどうでしょう?たとえば
「"http://www.atmarkit.co.jp/dom:aTag"」
という感じに。

どうも.NETには「GetElementsByTagNameNS」という関数はないようですが、名前空間に属するNodeListを取得するには確か名前空間とローカル名が必要だったと思います。
Atsushi.Eno
ベテラン
会議室デビュー日: 2003/04/23
投稿数: 60
投稿日時: 2003-12-05 18:53
SelectSingleNode()やSelectNodes()で、名前空間に属するノードを検索する場合には、引数にXmlNamespaceManagerを受け取るほうのSelectSingleNode()/SelectNodes()を使います。(これがそのエラーメッセージに出てくる「名前空間マネージャ」ということになります。)

コード:
XmlNamespaceManager nsmgr = new XmlNamespaceManager (domdoc.NameTable);
nsmgr.AddNamespace ("a", target_namespace);

return domdoc.SelectSingleNode ("a:aTag", nsmgr);


XmlNamespaceManagerが必要になるのは、XPath式に書かれているプレフィックスと名前空間の組み合わせが、必ずしもXmlDocument中で用いられているプレフィックスと名前空間の組み合わせと一致するとは限らないためです。
(XSLTのスタイルシートの名前空間宣言と入力XML文書の名前空間宣言は、同一とは限らないですよね。XSLTエンジンは、スタイルシートに書かれたselect文字列を、入力XMLに合わせて作り直すような無駄なことはしないのです)
1

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