我正在尝试编写一些代码来根据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方法中设置,并指向正确的文件。
有没有人有任何想法可以解决这个问题或建议另一种方法来按属性查找特定元素?
答案 0 :(得分: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);
答案 1 :(得分:1)
尝试在XPath查询的开头添加“//”,以便将任何 siteMapNode元素与正确的网址匹配,而不是仅匹配顶级网址。
(我不熟悉ASP.NET站点地图XML格式,所以这可能没有任何区别......)
编辑:我建议你使用XPath测试工具(周围有许多 - 我自己没有使用它们,因为我很少需要XPath表达式)。它们将允许您加载文档,然后向您显示XPath正在执行的操作。 看起来没关系,所以这很奇怪......答案 2 :(得分:0)
看起来很好,你尝试使用像:
这样的xpath** // **的SiteMapNode [@ URL = “〜/利/的Index.aspx”]
答案 3 :(得分:0)
站点地图文件包含顶级“siteMap”节点,该节点可以包含单个“siteMapNode”节点。 “siteMapNode”可以包含任意深度的子“siteMapNode”节点树。
虽然添加“//”将确保节点获得匹配,但这是一个草率和危险的习惯。如果您知道XML文档中的哪个节点可以找到,那么通常最好更明确地匹配。
在这种情况下,假设您想要的节点位于树的顶部,您想要的XPath可能是“siteMap / siteMapNode / siteMapNode [@url = \”〜/ lev / index.aspx \“ ]“即可。