在ASP.net中按属性查找XmlNode

在ASP.net中按属性查找XmlNode,.net,xml,xpath,.net,Xml,Xpath,我试图编写一些代码,根据XML站点地图中的URL查找特定的XmlNode对象,但无法让它查找任何内容 网站地图是标准的ASP.net网站地图,包含: <siteMapNode url="~/lev/index.aspx" title="Live-Eye-Views"> --- Child Items --- </siteMapNode> levRoot对象始终为空。当我在Load方法之后中断时,我可以看到XML文件中的所有元素,因此它按预期加载 我尝试在XPath查询中

我试图编写一些代码,根据XML站点地图中的URL查找特定的XmlNode对象,但无法让它查找任何内容

网站地图是标准的ASP.net网站地图,包含:

<siteMapNode url="~/lev/index.aspx" title="Live-Eye-Views">
--- Child Items ---
</siteMapNode>
levRoot对象始终为空。当我在Load方法之后中断时,我可以看到XML文件中的所有元素,因此它按预期加载

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

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

有人知道这是怎么回事吗?或者有人建议用另一种方法按属性查找特定元素吗?

尝试在XPath查询的开头添加“/”,以便它将任何siteMapNode元素与正确的url相匹配,而不仅仅是顶层的元素

(我不熟悉ASP.NET站点地图XML格式,因此这可能没有任何区别…)

编辑:我建议您使用一个XPath测试工具(有很多,我自己没有使用过,因为我很少需要XPath表达式)。它们将允许您加载文档,然后向您展示XPath正在做什么。它看起来不错,所以很奇怪…

尝试在XPath查询的开头添加“/”,这样它就可以将任何siteMapNode元素与正确的url相匹配,而不仅仅是那些位于顶层的元素

(我不熟悉ASP.NET站点地图XML格式,因此这可能没有任何区别…)


编辑:我建议您使用一个XPath测试工具(有很多,我自己没有使用过,因为我很少需要XPath表达式)。它们将允许您加载文档,然后向您展示XPath正在做什么。它看起来不错,所以很奇怪…

看起来不错,您是否尝试过使用xpath,如:


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

看起来不错,您是否尝试过使用xpath,如:


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

站点地图有一个默认的名称空间,但您不引用它

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

站点地图具有默认名称空间,但您不引用它

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

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

虽然添加“/”将确保节点获得匹配,但这是一个草率和危险的习惯。如果您知道在XML文档中的何处可以找到节点,那么通常最好更明确地进行匹配


在本例中,假设您想要的节点位于树的顶部,您想要的XPath可能是“siteMap/siteMapNode/siteMapNode[@url=\“~/lev/index.aspx\”]”“

站点地图文件包含顶级“siteMap”节点,该节点可以包含单个“siteMapNode”节点。“siteMapNode”可以包含任意深度的子“siteMapNode”节点树

虽然添加“/”将确保节点获得匹配,但这是一个草率和危险的习惯。如果您知道在XML文档中的何处可以找到节点,那么通常最好更明确地进行匹配


在本例中,假设您想要的节点位于树的顶部,您想要的XPath可能是“”siteMap/siteMapNode/siteMapNode[@url=\“~/lev/index.aspx\”]””

谢谢您这么快的回复。只是尝试了一下,但它仍然返回为空。在网站地图上尝试了几个URL,每个都得到了相同的结果。谢谢你这么快回复。只是尝试了一下,但它仍然返回为空。在站点地图中尝试了几个URL,每个都得到了相同的结果。
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);