2014-12-28 2 views
3

Я пытаюсь создать файл XHTMl с нуля с помощью HtmlAgilityPack. Следуя советам, представленные в Add a doctype to HTML via HTML Agility pack, я пытаюсь добавить доктайп к нему:Проблемы с doctype с помощью HtmlAgilityPack

private static HtmlDocument createEmptyDoc() 
{ 
    HtmlDocument titlePage = new HtmlDocument(); 

    titlePage.OptionOutputAsXml = true; 
    titlePage.OptionCheckSyntax = true; 

    titlePage.AddDoctype(); 

    var html = titlePage.CreateElement("html"); 
    titlePage.DocumentNode.AppendChild(html); 

    return titlePage; 
} 

public static class HtmlDocumentExtensions 
{ 
    public static void AddDoctype(this HtmlDocument doc) 
    { 
     var doctype = doc.DocumentNode.PrependChild(doc.CreateComment("<!doctype html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">")); 
    } 
} 

Однако, когда я пишу этот документ в файл, он выглядит следующим образом:

<?xml version="1.0" encoding="iso-8859-1"?> 
<!--type html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.d--> 
<html /> 

доктайп действительно получает обрабатывается как комментарий, а некоторые символы заменяются тире. Как я могу решить эту проблему и написать doctype как есть в файле?

EDIT: Добавлены пользовательские расширения для HTMLDocument

+0

Я не на Windows, так что я не могу проверить это, но мне кажется, вы не следуя советам в этих ответах. Кроме того, возможно, что 'OptionOutputAsXml = true' может стать причиной проблемы. – GolfWolf

+0

проверьте мой ответ и скажите мне, помогли ли вы. – mybirthname

+0

@ w0lf вы можете мне сказать, где я не следую советам? Мне нужен параметр OptionOutputAsXml = true, потому что мне нужен документ XHTML. – Thaoden

ответ

1
 static void Main(string[] args) 
     { 
      string html = @" 
<html> 
<body> 

<h1>My First Heading</h1> 

<p>My first paragraph.</p> 

<table> 
    <tr> 
     <td>A!!</td> 
     <td>te2</td> 
     <td>2!!</td> 
     <td>te43</td> 
     <td></td> 
     <td> !!</td> 
     <td>.!!</td> 
     <td>te53</td> 
     <td>te2</td> 
     <td>texx</td> 
    </tr> 
</table> 

<h4 class=""nikstyle_title""><a rel=""nofollow"" target=""_blank"" href=""http://www.niksalehi.com/ccount/click.php?ref=ZDNkM0xuQmxjbk5wWVc1MkxtTnZiUT09&id=117""><span class=""text-matn-title-bold-black"">my text</span></a></h4> 

</body> 
</html>"; 

      HtmlDocument doc = new HtmlDocument(); 
      doc.LoadHtml(html); 

      var doctype = doc.DocumentNode.SelectSingleNode("/comment()[starts-with(.,'<!DOCTYPE')]"); 
      if (doctype == null) 
       doctype = doc.DocumentNode.PrependChild(doc.CreateComment()); 

      doctype.InnerHtml = "<!DOCTYPE html>"; 

      string html2 = doc.DocumentNode.InnerHtml; 

     } 

код в другой вопрос дает способ сделать это. Вот полный пример.

+0

Это работает, хотя я не вижу разницы с моим кодом. Спасибо, в любом случае! – Thaoden

1

Попробуйте это:

using HtmlAgilityPack; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      HtmlDocument doc = new HtmlDocument(); 
      HtmlNode docNode = HtmlNode.CreateNode("<html><head></head><body></body></html>"); 
      HtmlNode rootNode = HtmlNode.CreateNode("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"); 
      doc.DocumentNode.AppendChild(rootNode); 
      doc.DocumentNode.AppendChild(docNode); 
      doc.Save("test.html"); 
     } 
    } 
} 
+0

Одно педантичное замечание: декларация doctype на самом деле не является «корневым узлом» (это будет элемент 'html'). В языке SGML это будет «объявление разметки». –

+0

Это работает, хотя я не вижу никакой реальной разницы в моем подходе ... – Thaoden

Смежные вопросы