노드 교체 HtmlAgilityPack

c# html-agility-pack

문제

나는 노드를 새로운 노드로 교체하고 싶다. 노드의 정확한 위치를 얻고 완전히 대체 할 수 있습니까?

나는 다음을 시도했지만, 노드의 인덱스 또는 부모 노드가 ReplaceChild() 를 호출하는 방법을 알아낼 수 없다.

string html = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
HtmlDocument document = new HtmlDocument();
document.LoadHtml(html);

var bolds = document.DocumentNode.Descendants().Where(item => item.Name == "b");

foreach (var item in bolds)
{

    string newNodeHtml = GenerateNewNodeHtml();
    HtmlNode newNode = new HtmlNode(HtmlNodeType.Text, document, ?);
    item.ParentNode.ReplaceChild( )
}

수락 된 답변

새 노드를 만들려면 HtmlNode.CreateNode() 팩터 리 메서드를 사용하고 생성자를 직접 사용하지 마십시오.

이 코드는 당신에게 도움이 될 것입니다 :

var htmlStr = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
var doc = new HtmlDocument();
doc.LoadHtml(htmlStr);

var query = doc.DocumentNode.Descendants("b");
foreach (var item in query.ToList())
{
    var newNodeStr = "<foo>bar</foo>";
    var newNode = HtmlNode.CreateNode(newNodeStr);
    item.ParentNode.ReplaceChild(newNode, item);
}

우리가 질의에 대해 ToList() 를 호출 할 필요가 있음을 주목하십시오. 그렇지 않으면 우리는 문서를 수정하여 실패 할 것입니다.


이 문자열로 바꾸려면 다음을 수행하십시오.

"some text <b>node</b> <strong>another node</strong>"

문제는 더 이상 단일 노드가 아니라 일련의 노드입니다. HtmlNode.CreateNode() 사용하여 잘 파싱 할 수 있지만 결국에는 시퀀스의 첫 번째 노드 만 참조하게됩니다. 상위 노드를 사용하여 대체해야합니다.

var htmlStr = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
var doc = new HtmlDocument();
doc.LoadHtml(htmlStr);

var query = doc.DocumentNode.Descendants("b");
foreach (var item in query.ToList())
{
    var newNodesStr = "some text <b>node</b> <strong>another node</strong>";
    var newHeadNode = HtmlNode.CreateNode(newNodesStr);
    item.ParentNode.ReplaceChild(newHeadNode.ParentNode, item);
}

인기 답변

새로 생성 된 노드에 HtmlDocument.DocumentNode 를 사용하고 있습니다.

string html = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
HtmlDocument document = new HtmlDocument();
document.LoadHtml(html);
var bolds = document.DocumentNode.Descendants().Where(item => item.Name == "b");
foreach (var item in bolds)
{
    string newNodeHtml = GenerateNewNodeHtml();
    var nodeDocument = new HtmlDocument();
    nodeDocument.LoadHtml(newNodeHtml);
    item.ParentNode.ReplaceChild(nodeDocument.DocumentNode);
}


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