2008-12-15 79 views
0

我试图编写一些代码来找到基于XML站点地图中的URL的特定XmlNode对象,但无法找到任何内容。在ASP.net中通过属性查找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对象总是空。当我在Load方法之后中断时,我可以看到XML文件中的所有元素,以便按预期进行加载。

我试过在XPath查询中使用单引号,但没有任何区别。

_siteMapFileName在Initialize方法中设置并指向正确的文件。

有没有人有任何想法可能会与此或建议另一种方式来查找特定元素的属性?

回答

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); 
+0

魔术,完美运作。谢谢! – 2008-12-15 14:10:02

1

尝试在您的XPath查询的开头添加“//”,以便匹配任意 sitemapNode元素具有正确的url,而不仅仅是位于顶层的那些元素。

(我不熟悉ASP.NET站点地图的XML格式,所以这可能没有什么差别......)

编辑:我建议你使用XPath测试工具(周围有很多 - 我自己并没有使用它们,因为我很少需要XPath表达式)。他们会让你加载你的文档,然后告诉你XPath在做什么。它看起来好,所以这是很奇怪......

+0

非常感谢您的回复。 只是给了一个尝试,但它仍然回来为空。 在网站地图中用几个网址试了一下,我得到了相同的结果。 – 2008-12-15 12:26:42

0

看起来不错AFAIK,你尝试过使用XPath,如:

** // **的SiteMapNode [@ URL =“〜/列弗/指数.aspx“]

0

站点地图文件包含一个顶级“网站地图”节点,它可以包含一个“的SiteMapNode”节点。该“siteMapNode”可以包含任意深度的子节点“siteMapNode”节点。

虽然添加“//”会确保节点获得匹配,但这是一种马虎和危险的习惯。如果您知道XML文档中的哪个节点可以找到,那么通常更明确地进行匹配。

在这种情况下,假设您想要的节点位于树顶部,您希望的XPath可能是“siteMap/siteMapNode/siteMapNode [@url = \”〜/ lev/index.aspx \“] “