0

XML サイトマップの URL に基づいて特定の XmlNode オブジェクトを検索するコードを作成しようとしていますが、何も検索できません。

サイトマップは、標準の ASP.net サイトマップであり、以下が含まれます。

<siteMapNode url="~/lev/index.aspx" title="Live-Eye-Views">
--- Child Items ---
</siteMapNode>

要素を検索するために使用しているコードは次のとおりです。

XmlDocument siteMapXml = new XmlDocument();
siteMapXml.Load(AppDomain.CurrentDomain.BaseDirectory + _siteMapFileName)
XmlNode levRoot = siteMapXml.SelectSingleNode("siteMapNode[@url=\"~/lev/index.aspx\"]");

levRoot オブジェクトは常に null です。Load メソッドの後で中断すると、XML ファイル内のすべての要素が表示されるので、期待どおりに読み込まれます。

XPath クエリで一重引用符を使用してみましたが、違いはありませんでした。

_siteMapFileName は Initialize メソッドで設定され、正しいファイルを指しています。

これで何が起きているのか、または属性ごとに特定の要素を見つける別の方法を提案している人はいますか?

4

4 に答える 4

2

サイトマップにはデフォルトの名前空間がありますが、それを参照することはありません。

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/lev/index.aspx" title="Live-Eye-Views">
    <!-- Child Items -->
  </siteMapNode>
</siteMap>

したがって、これを使用する必要があります。

XmlNamespaceManager nsmgr = new XmlNamespaceManager(siteMapXml.NameTable);
nsmgr.AddNamespace("smap", "http://schemas.microsoft.com/AspNet/SiteMap-File-1.0");
string xpath = "//smap:siteMapNode[@url=\"{1}\"]";
string url = "~/lev/index.aspx";
XmlNode levRoot = siteMapXml.SelectSingleNode(String.Format(xpath, url), nsmgr);
于 2008-12-15T12:37:54.977 に答える
1

XPath クエリの先頭に「//」を追加してみてください。これにより、最上位の要素だけでなく、適切な URL を持つ任意のsiteMapNode 要素と一致します。

(私は ASP.NET サイト マップの XML 形式に慣れていないので、違いはないかもしれません...)

編集: XPath テスト ツールを使用することをお勧めします (多くのツールがあります。XPath 式はほとんど必要ないため、自分で使用したことはありません)。ドキュメントをロードして、XPath が何をしているかを表示できます。大丈夫そうに見えて、とても変です

于 2008-12-15T12:11:38.417 に答える
0

サイトマップファイルには、単一の「siteMapNode」ノードを含むことができる最上位の「siteMap」ノードが含まれています。その「siteMapNode」には、子「siteMapNode」ノードの任意の深さのツリーを含めることができます。

「//」を追加すると、ノードが確実に一致するようになりますが、侵入するのはずさんで危険な習慣です。XMLドキュメントのどこにノードがあるかがわかっている場合は、通常、より明示的に一致させることをお勧めします。

この場合、必要なノードがツリーの最上位にあると想定します。必要なXPathはおそらく「siteMap / siteMapNode / siteMapNode [@ url = \ "〜/ lev /index.aspx\"]」です。

于 2008-12-15T12:41:15.020 に答える
0

次のようなxp​​athを使用してみましたか?

**//**siteMapNode[@url="~/lev/index.aspx"]

于 2008-12-15T12:12:45.217 に答える