2017-09-22 8 views
2

これはC#で管理する必要があるより複雑なXMLの簡略化されたバージョンです。ローカル名XPATHでコロンを使用してXMLタグを管理する方法

名前空間内のタグにアクセスしようとすると、XPATHは機能しません。

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml("<s:Body xmlns:s=\"sssssss\"><s:SessionID>abcde</s:SessionID></s:Body>"); 
string xpath = "//*[local-name()='s:SessionID']"; 
Context.UserLogger.Info(xmlDoc.SelectSingleNode(xpath).InnerText); 
//Object reference not set to an instance of an object 

しかし、コードはタグにコロンを付けずに完全に機能します。

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml("<s:Body xmlns:s=\"sssssss\"><SessionID>abcde</SessionID></s:Body>"); 
string xpath = "//*[local-name()='SessionID']"; 
Context.UserLogger.Info(xmlDoc.SelectSingleNode(xpath).InnerText); 
//abcde 

私は "// * [ローカル名()=さん:セッションIDが ']" XPATHバリデータに確保しています正常に動作します。

私には何が欠けていますか?事前に

おかげで、

私はXmlNamespaceManagerに関する情報を読みましたが、私は「直接」のパスを使用することを好むだろう。 XMLはネームスペースでいっぱいであり、動的なので、構造がかなり頻繁に変更されます。

+1

直接 "パス" *とはどういう意味ですか? XMLに名前空間があり、XPathを使用するには名前空間マネージャが必要です。物語の終わり。 – Tomalak

+0

オンラインのXpathを持つ@Tomalakは、 "直接"パスを検証します// * [local-name()= 's:SessionID'はネームスペースの管理なしで動作します。 – Andoxko

+1

これが実際に動作するのは、その特定のオンラインXPathテスターが壊れているからです。 'local-name()'は '' s:SessionID''のようなものを返すことはありません。 – Tomalak

答えて

0

機能local-name()戻りのみあなたのケースで表現 '// * [ローカル名は、()=さん:セッションID「]」理由ですその正確SessionIDであることをタグ名のローカル部分ません仕事(あなたは修飾名だけでなく、文字列を比較する必要があります)あなたの質問から よりも仕事をdoesntの場合、それはこれだけXPath式

string xpath = "//s:SessionID"; 

を使用していた場合、あなたは、SessionsID要素を選択することに興味があるように私には思えます接頭辞sを名前空間uri s = \ "sssssss \"でバインドする必要があるかもしれません(あなたの例から取る)

関連する問題