2014-12-28 60 views
3

我試圖用HtmlAgilityPack從頭創建一個XHTMl文件。繼Add a doctype to HTML via HTML Agility pack提出的建議,我嘗試將文檔類型添加到它:使用HtmlAgilityPack的doctype的問題

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真正得到作爲評論對待,一些字符被短劃線代替。我該如何解決這個問題,並將doctype原樣寫入文件?

編輯:添加自定義擴展到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