Parsing Html Agility Pack:DegenantSorself()未返回Html元素

Parsing Html Agility Pack:DegenantSorself()未返回Html元素,parsing,asp.net,html-agility-pack,Parsing,Asp.net,Html Agility Pack,我有一些HTML,例如: <%@ Page Title="About Us" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeBehind="ContentManagedTargetPage.aspx.cs" Inherits="xxx.ContentManagedTargetPage" %> <%@ Register TagPrefix="CxCMS" Namespace=

我有一些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>
这只会引发异常:“需要命名空间管理器或XsltContext。此查询具有前缀、变量或用户定义的函数。”。我找不到任何向HtmlDocument对象添加命名空间管理的方法


我错过了什么,在这里?如果使用“标准”HTML标记,如“p”,但不是我现有的标记,那么degenantsorself()方法可以工作。它肯定会起作用吗?(它需要!)

像往常一样,我花一个小时左右的时间玩,我问问题,几秒钟后我就想出来了


使用DegenantSorself()搜索时,节点名称必须小写。

您的示例实际上是ASPX。如果您正在解析该页面的输出,
是否真的呈现为客户端的输出,这是值得怀疑的。查看客户端上的html源代码,找到与
对应的输出标记,然后使用
HtmlDocument.DocumentNode.substands
中的标记

另一方面,如果要解析ASPX源代码,可能需要调整输入到
HtmlDocument.DocumentNode.subderstands
,以便HtmlAgilityPack识别它,但是请记住,ASPX!=html,我不认为HtmlAgilityPack是用来解析它的

编辑:查看HtmlGilitypack源代码中的HtmlNode.cs,由于以下两个部分的原因,您认为它需要小写,这似乎是正确的:

    /// <summary>
    /// Gets or sets this node's name.
    /// </summary>
    public string Name
    {
        get
        {
            if (_name == null)
            {
                Name = _ownerdocument._text
                                     .Substring(_namestartindex, _namelength);
            }
            return _name != null ? _name.ToLower() : string.Empty;
        }
        set { _name = value; }
    }
//
///获取或设置此节点的名称。
/// 
公共字符串名
{
得到
{
如果(_name==null)
{
名称=_所有者文档。_文本
.子字符串(_namestindex,_namelength);
}
return _name!=null?_name.ToLower():string.Empty;
}
设置{u name=value;}
}

//
///获取具有匹配名称的所有子代节点
/// 
/// 
/// 
公共IEnumerable子体(字符串名称)
{
foreach(子体()中的HtmlNode节点)
if(node.Name==Name)
收益回报节点;
}

注意
name
的getter中的
\u name.ToLower()
,以及
decentants
方法中区分大小写的
if(node.name==name)
。这与
子代和self
元素和
元素的方法使用的检查相同。

是的,我正在使用ASPX源代码。在计算出小写字母后,它似乎在我迄今为止所做的测试中起作用!谢谢
string searchForElement = "CxCMS:ContentManagedPlaceHolder";
IEnumerable<HtmlNode> contentPlaceHolderHtmlNodes = HtmlDocument.DocumentNode.DescendantsOrSelf(searchForElement);
int count = contentPlaceHolderHtmlNodes.Count();                
string searchForElement = "CxCMS:ContentManagedPlaceHolder";
IEnumerable<HtmlNode> contentPlaceHolderHtmlNodes = HtmlDocument.DocumentNode.DescendantsOrSelf().Where(q=>q.Name==searchForElement);
int count = contentPlaceHolderHtmlNodes.Count();                
string searchForElement = "CxCMS:ContentManagedPlaceHolder";
string xPath="//"+searchForElement // "//CxCMS:ContentManagedPlaceHolder"
var nodes= HtmlDocument.DocumentNode.SelectNodes(xPath);
    /// <summary>
    /// Gets or sets this node's name.
    /// </summary>
    public string Name
    {
        get
        {
            if (_name == null)
            {
                Name = _ownerdocument._text
                                     .Substring(_namestartindex, _namelength);
            }
            return _name != null ? _name.ToLower() : string.Empty;
        }
        set { _name = value; }
    }
    /// <summary>
    /// Get all descendant nodes with matching name
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public IEnumerable<HtmlNode> Descendants(string name)
    {
        foreach (HtmlNode node in Descendants())
            if (node.Name == name)
                yield return node;
    }