Agility Pack으로 기존 노드를 다른 노드로 둘러 쌉니다.

c# html-agility-pack

문제

<div class="overflow"></div> 노드를 사용하여 모든 테이블을 둘러 쌀 수있는 방법은 무엇입니까? 이것은 분명히 그것을하지 않습니다 :

if (oldElement.Name == "table")
{
    HtmlDocument doc = new HtmlDocument();
    HtmlNode newElement = doc.CreateElement("div");
    newElement.SetAttributeValue("class", "overflow");
    newElement.AppendChild(oldElement);
    oldElement.ParentNode.ReplaceChild(newElement, oldElement);
}

이 코드를 사용해도 테이블에 아무런 변화가 없습니다. 하지만 내가 사용하는 경우 :

if (oldElement.Name == "table")
{
    oldElement.Remove();
}

모든 테이블이 실제로 제거되므로 정확한 노드에 액세스하고 있음을 확신합니다.

수락 된 답변

못생긴 일이지만, oldElement.ParentNode 노드의 InnerHtml 속성을 다음과 같이 편집하면됩니다.

if (oldElement.Name == "table")
{
    oldElement.ParentNode.InnerHtml = "\r\n<div class=\"overflow\">\r\n"
        + oldElement.OuterHtml +
        "\r\n</div>\r\n";
}

또한 oldElement의 OuterHtml 특성을 편집 할 수있는 것처럼 보이지 않습니다 (ParentNode를 먼저 가져야하는 이유입니다). HtmlAgilityPack은 OuterHtml을 가져 오거나 설정할 수 있다고 말합니다.하지만 VS2010은 읽기 전용 속성이라고 말했습니다.

편집하다

이것을 알아 내기 위해 몇 가지 코드를 가지고 oldElement.ParentNode AppendChild() 가 호출 된 후 oldElement.ParentNode<div> 노드가된다는 것을 oldElement.ParentNode . 내가 찾은 솔루션은 if 블록의 시작 부분에 부모 노드를 유지하고 그 노드에서 ReplaceChild() 를 호출하는 또 다른 HtmlNode 를 만드는 것입니다.

if (oldElement.Name == "table")
{
    HtmlNode theParent = oldElement.ParentNode;

    HtmlDocument doc = new HtmlDocument();
    HtmlNode newElement = doc.CreateElement("div");
    newElement.SetAttributeValue("class", "overflow");
    newElement.AppendChild(oldElement);

    theParent.ReplaceChild(newElement, oldElement);
}

인기 답변

jQuery의 C # 포트 인 CsQuery를 살펴보십시오. 이것은 쉽게 성취 될 수 있습니다. 먼저 문서를로드하십시오.

CQ doc = CQ.CreateFromFile(..)  // or
CQ doc = CQ.CreateFromUrl(..)   // or
CQ doc = CQ.Create(string)

여기에 4 가지 방법으로 래핑 할 구조를 만듭니다.

var wrap = CQ.CreateFragment("<div class='overflow'></div>");   // or

// you can pass HTML as a selector as in jQuery. The property indexer for a CQ
// object is the default method, same as $(..)

var wrap = doc["<div class='overflow'></div>"];   // or

var wrap = doc["<div />"].AddClass("overflow");  // or

// creates an element directly, sames as browser DOM methods

var wrap = doc.Document.CreateElement("div");
wrap.ClassName="overflow";

구조로 모든 테이블을 래핑하십시오.

doc["table"].Wrap(wrap);          // or use longhand for the Select method

doc.Select("table").Wrap(wrap);   

전체 문서를 문자열로 렌더링합니다.

string html = doc.Render();



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