2017-07-19 56 views
1

我正在閱讀HTML,目的只是從中提取<body>的內容。閱讀HTML文檔時XDocument沒有html元素

下面的標記是由DevExpress RichEditControl

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title> 
     </title> 
     <style type="text/css"> 
      .cs95E872D0{text-align:left;text-indent:0pt;margin:0pt 0pt 0pt 0pt} 
      .csCF6BBF71{color:#000000;background-color:transparent;font-family:Times New Roman;font-size:12pt;font-weight:normal;font-style:normal;} 
     </style> 
    </head> 
    <body> 
     <p class="cs95E872D0"><span class="csCF6BBF71">Content goes here</span></p></body> 
</html> 

產生在從this answer如何讀取文件的例子,我寫了下面的功能:

private string ParseHtml(string html) 
{ 
    XDocument doc = XDocument.Parse(html); 
    return doc.Elements("html").Single().Element("body").Value; 
} 

好像它應該工作在理論,但在實踐中,LINQ查詢返回.Elements("html")

我沒有結果在這裏標記?我如何閱讀html文檔並提取我需要的內容?

回答

1

可能是因爲您需要添加命名空間:

private string ParseHtml(string html) 
{ 
    XNamespace xmlns= "http://www.w3.org/1999/xhtml"; 

    XDocument doc = XDocument.Parse(html); 
    return doc.Element(xmlns+"html").Element(xmlns+"body").Value; 
} 

或者:

return doc.Descendants(xmlns+"body").Single().Value; 

而且解析一個html的好方法是使用HTML Agility Pack

+0

我想補充'XNamespace'有一個GetName方法,而XName也有一個get方法。而不是硬編碼命名空間doc.Root.GetDefaultNamespace();會得到「http://www.w3.org/1999/xhtml」,如果元素中沒有命名空間,它就會工作。 –