2012-10-12 2 views
2

은 (_이 공백에 사용되는) 다음과 같은 HTML 조각을 고려 : 나는 HTML 파일/조각을 읽고 링크를 제거하기 위해 HTML을 민첩성 팩 (HAP)를 사용하고원본 입력에서 HtmlNode의 위치와 길이를 가져올 수 있습니까?

<head> 
    ... 
    <link ... ___/> 
    <!-- ... --> 
    ... 
</head> 

. 내가 찾고 있어요 노드를 얻을

<head> 
    ... 
    ____________ 
    <!-- ... --> 
    ... 
</head> 

파싱 부분은 지금까지 작동하는 것 같군 : 내가하고 싶은 것은 LINK (및 기타) 요소를 찾아 다음과 같이 공백으로 대체하다 에 대한. 그러나 HAP은 모든 것을 으로 정확히이되어야하지만, HTML 내용을 고치려고합니다. 단, 변경하려는 사항은 예외입니다. 게다가 HAP은 이전에 읽은 내용을 다시 쓰는 것에 관해서는 꽤 많은 버그가있는 것 같습니다. 그래서 내가 취하고 싶은 접근법은 HAP이 입력을 분석하도록 한 다음 원래 입력으로 돌아가서 원하지 않아.

문제는 HtmlNode에 입력 길이 속성이없는 것 같습니다. 그것은 StreamPosition을 가지고 있는데 이는 입력 내용 내에서 노드 콘텐트의 읽기가 시작된 곳을 가리키는 것으로 보이지만 노드를 만들기 위해 얼마나 많은 문자가 소비되었는지를 알려주는 길이 속성을 찾을 수 없습니다.

난 (a LINK 요소가 폐쇄 될 예정되지 않은) 불행히도, HAP는 ___/ 파트를 제거하여 LINK를 해결하려고는 OuterHtml 인적 또는 사용을 시도했지만. 이 때문에 OuterHtml.Length은 잘못된 길이를 반환합니다.

HAP에는이 정보를 얻을 수있는 방법이 있습니까?

답변

3

개인 _outerlength 필드를 HtmlNode으로 반환하는 새 속성을 노출하기 위해 HtmlAgilityPack의 코드를 수정했습니다.

public virtual int OuterLength 
{ 
    get 
    { 
     return (_outerlength); 
    } 
} 

이것은 지금까지 잘 작동하는 것 같습니다.

2

HAP을 다시 컴파일하지 않고 동일한 결과를 얻으려면 리플렉션을 사용하여 개인 변수에 액세스하십시오.

대개 개인 변수에 액세스하는 데 리플렉션을 사용하지 않는 것이 좋습니다. 그러나 최근에 어셈블리의 다시 컴파일 된 버전을 사용할 수 없어서 리플렉션을 사용했습니다. 이렇게하려면, 필드 정보 객체를 보유하고 정적 변수를 생성 (모든 사용에 그것을 다시 피하기 위해) :

private static readonly FieldInfo HtmlNodeOuterLengthFieldInfo = typeof(HtmlNode).GetField("_outerlength", BindingFlags.NonPublic | BindingFlags.Instance); 

을 그럼 당신은 원래 외부 HTML의 실제 길이에 액세스 할 때마다 :

var match = htmlDocument.DocumentNode.SelectSingleNode("xpath"); 
var htmlLength = (int)HtmlNodeOuterLengthFieldInfo.GetValue(match); 
관련 문제