2010-06-16 4 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 Agility Pack을 사용하고 있습니다.

그러나 [빈약 한] 문서를 보았지만 코드를 작동시킬 수 없습니다.

나는 일에 다음과 같은 기대 :

string searchForElement = "CxCMS:ContentManagedPlaceHolder"; 
IEnumerable<HtmlNode> contentPlaceHolderHtmlNodes = HtmlDocument.DocumentNode.Descendants(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"; 
IEnumerable<HtmlNode> contentPlaceHolderHtmlNodes = HtmlDocument.DocumentNode.DescendantsOrSelf(searchForElement); 
int count = contentPlaceHolderHtmlNodes.Count();     

가 나는 또한 LINQ를 사용하여 시도 : 잘못된 - 나는 DescendantsOrSelf로 변경하는 경우

, 나는 다시 "#document을"문서 노드를 얻을 수 메서드가 작동하면 SelectNodes를 대신 사용합니다.

string searchForElement = "CxCMS:ContentManagedPlaceHolder"; 
string xPath="//"+searchForElement // "//CxCMS:ContentManagedPlaceHolder" 
var nodes= HtmlDocument.DocumentNode.SelectNodes(xPath); 

이 예외는 단지 throw됩니다. "네임 스페이스 관리자 또는 XsltContext가 필요합니다. 이 쿼리는 접두어, 변수 또는 사용자 정의 함수를 가지고 있습니다. "HymDocument 개체에 네임 스페이스 관리를 추가 할 방법이 없습니다.

DescendantsOrSelf() 메서드는 다음과 같은 경우 작동합니다. "p"와 같은 "표준"HTML 태그를 사용하지만 실제로는 작동하지 않습니다. (반드시해야합니다!)

답변

1

보통 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에 대한 getter의 _name.ToLower()Decendants 메서드의 대/소문자 구분 if (node.Name == name)에 유의하십시오.이것은 DescendantsAndSelf, ElementElements 방법과 동일한 검사입니다.

+0

예, ASPX 소스로 작업하고 있습니다. 그것은 내가 지금까지 해본 테스트에서, 소문자를 계산 한 후에 작동하는 것 같습니다! 감사. –

관련 문제