我有一些 HTML,例如:
<%@ Page Title="About Us" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeBehind="ContentManagedTargetPage.aspx.cs" Inherits="xxx.ContentManagedTargetPage" %>
<%@ Register TagPrefix="CxCMS" Namespace="xxx.ContentManagement.ASPNET.UI" Assembly="xxx.ContentManagement.ASPNET" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>
Content Managed
</h2>
<p>
Put content here.
[<CxCMS:ContentManagedPlaceHolder Key="keyThingy" runat="server" />]
</p>
</asp:Content>
我想找到 CxCMS:ContentManagedPlaceHolder 元素的所有实例。
我正在使用 HTML Agility Pack,这似乎是最合适的。
但是,尽管查看了 [meagre] 文档,但我无法让我的代码正常工作。
我希望以下工作:
string searchForElement = "CxCMS:ContentManagedPlaceHolder";
IEnumerable<HtmlNode> contentPlaceHolderHtmlNodes = HtmlDocument.DocumentNode.Descendants(searchForElement);
int count = contentPlaceHolderHtmlNodes.Count();
但我什么也得不到。
如果我更改为 DescendantsOrSelf,我将返回文档节点“#document”——这是不正确的:
string searchForElement = "CxCMS:ContentManagedPlaceHolder";
IEnumerable<HtmlNode> contentPlaceHolderHtmlNodes = HtmlDocument.DocumentNode.DescendantsOrSelf(searchForElement);
int count = contentPlaceHolderHtmlNodes.Count();
我也尝试过使用 LINQ:
string searchForElement = "CxCMS:ContentManagedPlaceHolder";
IEnumerable<HtmlNode> contentPlaceHolderHtmlNodes = HtmlDocument.DocumentNode.DescendantsOrSelf().Where(q=>q.Name==searchForElement);
int count = contentPlaceHolderHtmlNodes.Count();
由于这些方法都不起作用,我转而使用 SelectNodes,而不是:
string searchForElement = "CxCMS:ContentManagedPlaceHolder";
string xPath="//"+searchForElement // "//CxCMS:ContentManagedPlaceHolder"
var nodes= HtmlDocument.DocumentNode.SelectNodes(xPath);
这只会引发异常:“需要命名空间管理器或 XsltContext。此查询具有前缀、变量或用户定义的函数。”。我找不到将命名空间管理添加到 HtmlDocument 对象的任何方法。
我在这里错过了什么?DescendantsOrSelf() 方法在使用“标准”HTML 标签(例如“p”)时有效,但不是我拥有的标签。当然它应该工作?(它需要!)