HTML 민첩성 팩을 사용하여 HTML 스 니펫을 편집하는 방법

c# html-agility-pack

문제

따라서 C #을 사용하여 수정하려는 HTML 스 니펫이 있습니다.

<div>
This is a specialSearchWord that I want to link to
<img src="anImage.jpg" />
<a href="foo.htm">A hyperlink</a>
Some more text and that specialSearchWord again.
</div>

나는 이것을 다음과 같이 변형시키고 싶다.

<div>
This is a <a class="special" href="http://mysite.com/search/specialSearchWord">specialSearchWord</a> that I want to link to
<img src="anImage.jpg" />
<a href="foo.htm">A hyperlink</a>
Some more text and that <a class="special" href="http://mysite.com/search/specialSearchWord">specialSearchWord</a> again.
</div>

여기 많은 권장 사항을 기반으로 HTML 민첩성 팩을 사용할 예정이지만 어디로 갈지는 알 수 없습니다. 특히,

  1. 전체 HTML 문서 대신 부분 스 니펫을 문자열로로드하려면 어떻게해야합니까?
  2. 어떻게 편집합니까?
  3. 그런 다음 편집 된 객체의 텍스트 문자열을 어떻게 반환합니까?

수락 된 답변

  1. 전체 HTML 문서와 동일합니다. 그건 중요하지 않아.
  2. 두 가지 옵션 : InnerHtml 속성을 직접 편집하거나 텍스트 노드의 Text 를 편집하거나 예를 들어 AppendChild , PrependChild 등을 사용하여 dom 트리를 수정할 수 있습니다.
  3. HtmlDocument.DocumentNode.OuterHtml 속성을 사용하거나 HtmlDocument.Save 메서드를 사용할 수 있습니다 (개인적으로 두 번째 옵션을 선호합니다).

파싱에 관해서는 div 내에서 검색어가 포함 된 텍스트 노드를 선택한 다음이를 바꾸기 위해 string.Replace 메소드를 사용합니다.

var doc = new HtmlDocument();
doc.LoadHtml(html);
var textNodes = doc.DocumentNode.SelectNodes("/div/text()[contains(.,'specialSearchWord')]");
if (textNodes != null)
    foreach (HtmlTextNode node in textNodes)
        node.Text = node.Text.Replace("specialSearchWord", "<a class='special' href='http://mysite.com/search/specialSearchWord'>specialSearchWord</a>");

결과를 문자열에 저장 :

string result = null;
using (StringWriter writer = new StringWriter())
{
    doc.Save(writer);
    result = writer.ToString();
}

인기 답변

답변:

  1. 이렇게하는 방법이있을 수 있지만 어떻게해야할지 모르겠다. 전체 문서를로드하는 것이 좋습니다.
  2. XPath와 정규 표현식의 조합 사용
  3. 인위적인 예제는 아래 코드를 참조하십시오. 언급되지 않은 다른 제약 조건이있을 수 있지만이 코드 샘플을 시작해야합니다.

Xpath 표현식은 원하는 div를 찾는 데 더 복잡 할 수 있습니다.

HtmlDocument doc = new HtmlDocument();

doc.Load(yourHtmlFile);
HtmlNode divNode = doc.DocumentNode.SelectSingleNode("//div[2]");
string newDiv = Regex.Replace(divNode.InnerHtml, @"specialSearchWord", 
"<a class='special' href='http://etc'>specialSearchWord</a>");
divNode.InnerHtml = newDiv;
Console.WriteLine(doc.DocumentNode.OuterHtml);


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.