4

XPathNavigator に問題があります。ストリームに名前空間のない「トピック」要素の束を含むドキュメントがあります。

私は使用しています(式は最小限に抑えられています。最初は自分の式が間違っていると思いました):

XPathDocument xmlDoc = new XPathDocument( stream );
XPathNavigator xml = xmlDoc.CreateNavigator();
XPathNodeIterator iter = xml.Select( "//topic" );

これはうまくいきません。または同様のものを選択*/*/*して、「トピック」要素を問題なく取得できます。オンラインテスターや他の言語で式を実​​行してみましたが、うまくいきました。

質問: 何が問題なのですか? 名前空間を使用してドキュメントを解析するたびに信じられないほどの痛みを引き起こす、呪われた NamespaceManager オブジェクトに関係しているという疑いが長引いていますが、今回は、探している要素に明示的な名前空間がありません! 追加した:

XmlNamespaceManager s = new XmlNamespaceManager( xml.NameTable ); 

それを2番目の引数としてSelectに渡します-無駄に。「」名前空間をこのものに追加する/正しく使用するにはどうすればよいですか?

または、さらに良いことに、他の言語のように、クラスのこの恐ろしい忌まわしさを使用せずに、.NET で XPath を使用する方法はありますか? 名前空間が必要な場合は、式に記述できます...

更新:回避策を見つけました-ルートノードからデフォルトのxmlnsをコピー/貼り付けてから、その名前空間を使用します:

thisIsRetarded.AddNamespace( "x", "urn:xmind:xmap:xmlns:content:2.0" );
XPathNodeIterator projectIter = projectTree.Select( "//x:topic", thisIsRetarded );

ただし、デフォルトの URI を知っている必要はありませんし、式を不要な x:-s で汚染することも好きではありません。したがって、今は質問の2番目の部分への回答のみが必要です。

4

2 に答える 2

4

私は使用することを好みますXmlDocument

XmlDocument doc = new XmlDocument();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("sample", "...");
doc.Load(stream);

XmlNode topic = doc.SelectSingleNode("/sample:topic", nsmgr);

// If you don't have any namespaces....
XmlNode topic2 = doc.SelectSingleNode("/topic"); 
于 2010-01-11T00:38:37.777 に答える