2010-06-16 83 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