HTMLAgilityPack을 사용하여 특정 순서로 노드를 삽입하는 데 문제가 있음

asp.net-mvc-4 c# html-agility-pack nodes

문제

나는 HTMLAgility로 다시 한 번 잃어버린다.

다음은 작업중인 HTML 문자열입니다.

<table>...</table>

추가하여이 문제를 해결하기 위해 노력하고 있습니다.

<html>
   <head>
   ...
   </head>
   <body>
      <table>
      ...
      </table>
   </body>
</html>

여기 내 코드가 있는데, 나는 시체를 제외한 모든 것을 얻을 수있다. 어떤 조언?

HtmlNode htmlNode = doc.DocumentNode.SelectSingleNode("//html");
if (htmlNode == null)
{
    htmlNode = doc.CreateElement("html");
    HtmlNodeCollection htmlCollection = doc.DocumentNode.ChildNodes;
    htmlNode.AppendChildren(htmlCollection);
    doc.DocumentNode.RemoveAllChildren();
    doc.DocumentNode.PrependChild(htmlNode);
}

//check if <head> exists, if not create <head>
HtmlNode head = doc.DocumentNode.SelectSingleNode("//head");
if (head == null)
{
    head = doc.CreateElement("head");
    HtmlNodeCollection htmlCollection = doc.DocumentNode.ChildNodes;
    htmlNode.PrependChild(head);
}

HtmlNode cssLink = doc.DocumentNode.SelectSingleNode("//link[contains(@href, " + Url.Content("/assets/global/css/reset.css") + ")]");
if (cssLink == null)
{
    cssLink = doc.CreateElement("link");
    cssLink.SetAttributeValue("rel", "stylesheet");
    cssLink.SetAttributeValue("href", Url.Content("/assets/global/css/reset.css"));
    head.AppendChild(cssLink);
}

//check if <body> exists, if yes, add style='margin:0; padding:0'
HtmlNode htmlBody = doc.DocumentNode.SelectSingleNode("//body");
if (htmlBody == null)
{
    head = doc.DocumentNode.SelectSingleNode("//head");
    htmlBody = htmlNode.CloneNode("body", true);
    htmlNode.ChildNodes.Clear();
    htmlNode.AppendChild(htmlBody);
    //HtmlNodeCollection htmlCollection = doc.DocumentNode.ChildNodes;
    //htmlBody.AppendChildren(htmlCollection);
    //doc.DocumentNode.RemoveAllChildren();
    //doc.InsertBefore(htmlBody);
    //head.DocumentNode.AppendChild(htmlBody);
    //htmlNode.PrependChild(htmlBody);
}

이 코드는 나에게 이것을 제공합니다 - <body> 가 잘못된 위치에 있음을 알 수 있습니다.

<html>
   <body>
      <head>
      ...
      </head>
      <table>
      ...
      </table>
  </body>
</html>

수락 된 답변

<head> 를 제외한 <head> <html> 의 모든 내용을 <body> 태그 내에 넣기를 원하기 때문에 <head> 를 추가하기 전에 <body> 노드를 먼저 추가 할 수 있습니다.

.....
HtmlNode htmlBody = doc.DocumentNode.SelectSingleNode("//body");
if (htmlBody == null)
{
    htmlBody = doc.CreateElement("body");
    //move all child of <html> to be child of <body>
    HtmlNodeCollection htmlCollection = htmlNode.ChildNodes;
    htmlBody.AppendChildren(htmlCollection);
    htmlNode.RemoveAllChildren();
    //add <body> to <html>
    htmlNode.PrependChild(htmlBody);
}

//check if <head> exists, if not create <head>
HtmlNode head = doc.DocumentNode.SelectSingleNode("//head");
if (head == null)
{
    //add <head> to <html>
    head = doc.CreateElement("head");
    htmlNode.PrependChild(head);
}
.....


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