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 对象始终为空。当我在 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

看起来不错afaik,您是否尝试过使用类似的xpath:

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

于 2008-12-15T12:12:45.217 回答
0

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

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

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

于 2008-12-15T12:41:15.020 回答