2010-06-16 85 views
0

我有一些HTML,例如:的Html敏捷包:DescendantsOrSelf()没有返回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敏捷包,这似乎是最合适的。

但是,尽管看了[微软]文档,我无法让我的代码正常工作。

我希望下面的工作:

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()方法在if使用“标准”HTML标签,如“p”,但不是我所拥有的,当然它应该工作吗?(它需要!)

回答

1

像往常一样,我花了一个小时左右的时间玩,和我秒后看着办吧。

当使用DescendantsOrSelf搜索(),节点名称必须是小写。

0

你举的例子实际上是ASPX。如果你正在解析该页面的输出,那么<CxCMS:ContentManagedPlaceHolder Key="keyThingy" runat="server" />实际上在客户端呈现的结果是值得怀疑的。查看客户端上的html源代码,找到对应于<CxCMS:ContentManagedPlaceHolder Key="keyThingy" runat="server" />的输出标签,然后使用HtmlDocument.DocumentNode.Descendants中的那些标签。另一方面,如果你解析ASPX源代码,你可能需要调整输入到HtmlDocument.DocumentNode.Descendants,以便HtmlAgilityPack识别它,但请记住,ASPX!= html,我不认为HtmlAgilityPack是为解析它而构建的。

编辑:通过在HtmlAgilityPack源代码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; } 
    } 

/// <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; 
    } 

请注意Name中的吸气器中的_name.ToLower()以及Decendants方法中的区分大小写的if (node.Name == name)。这是使用DescendantsAndSelf,ElementElements方法的相同检查。

+0

是的,我正在使用ASPX源码。它似乎在我迄今为止所做的测试中发挥作用,在将小写字母的东西写出来之后!谢谢。 – 2010-06-16 18:56:07