2014-12-28 47 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