- PR -

XPathのエラー

1
投稿者投稿内容
KKK
大ベテラン
会議室デビュー日: 2003/10/10
投稿数: 119
投稿日時: 2004-01-14 11:55
こんにちは。
VB.NETで開発している者です。

<?xml version="1.0" encoding="utf-8" ?>
<SetLabel xmlns="http://www.ERPPKG/SetLabel">
  <Report PrgID="AA" Label="1">
<Name>Name1</Name>
  </Report>
</SetLabel>

上記のようなXML文書から、XPathを用いて、該当するデータを取得したいと
思っています。
(以下、コーディング)

Dim xmlDocument As Xml.XmlDocument

xmlDocument = New Xml.XmlDocument
xmlDocument.Load(C:\AAA.xml")

xmlDocument.SelectNodes("//Report[@PrgID='AA']").Count

↑このとき、結果は"0"になっています。
つまり一件もデータが取得できていないのです。

どこか間違っているところがありましたら、ぜひご教授ください。
お願いします。
JW
常連さん
会議室デビュー日: 2004/01/14
投稿数: 49
投稿日時: 2004-01-15 00:45
デフォルト名前空間が原因ですね。

http://www.doraneko.org/xml/xpath/REC991116.html
引用:

XPathは、XML名前空間を完全にサポートしている。そこで、ノードの名前は、ローカル部分1個と、ヌルでもよいが名前空間URI1個とからなるペアとしてモデル化される。これは展開名と呼ばれる。



と言うことで、検索する際にXML側はデフォルト名前空間でも内部的には「URI+ローカル部分」
として扱われます。
Xpath側は名前空間の指定が無いため、URI無しの<Report>を探しに行きます。
結果としてマッチしません。

XPath側で適当に名前空間識別子をつける必要があるのかと思います。
下の例では「samp」にしています。

Dim doc As XmlDocument
Dim manager As XmlNamespaceManager

doc = New XmlDocument()
doc.Load("AAA.xml")
manager = New XmlNamespaceManager(doc.NameTable)
manager.AddNamespace("samp","http://www.ERPPKG/SetLabel")

doc.SelectNodes("//samp:Report[@PrgID='AA']",manager).Count
KKK
大ベテラン
会議室デビュー日: 2003/10/10
投稿数: 119
投稿日時: 2004-01-16 22:33
ありがとうございます。

名前空間が原因なのですね!!
名前空間とノードの名前をセットで記述したら、出来ました。
勉強になりました。
1

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