0

這裏是超級簡單的代碼,我打破XML聲明:OptionWriteEmptyNodes使用HtmlAgilityPack

HtmlDocument htmlDoc = new HtmlDocument(); 
htmlDoc.OptionWriteEmptyNodes = true; 
htmlDoc.Load("sourcefilepath"); 
htmlDoc.Save("destfilepath", Encoding.UTF8); 

輸入:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/> 
    <link rel="stylesheet" href="main.css" type="text/css"/> 
    </head> 
    <body>lots of text here, obviously not relevant to this problem</body> 
</html> 

輸出:

<?xml version="1.0" encoding="UTF-8" /> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" /> 
    <link rel="stylesheet" href="main.css" type="text/css" /> 
    </head> 
    <body>lots of text here, obviously not relevant to this problem</body> 
</html> 

你可以看到,在第一行有一個錯誤:/>而不是?> 這發生如果我將OptionWriteEmptyNodes設置爲true值。它已被設置爲true,因爲否則元/鏈接標記(以及文檔正文中的一些標記)將不會關閉。

任何人都知道如何解決這個問題?

回答

1

看起來像一個錯誤。您應該將其報告給http://htmlagilitypack.codeplex.com

不過,你可以解決辦法像這樣的錯誤:

HtmlNode.ElementsFlags.Remove("meta"); 
HtmlNode.ElementsFlags.Remove("link"); 
HtmlDocument htmlDoc = new HtmlDocument(); 
htmlDoc.Load("sourcefilepath"); 
htmlDoc.Save("destfilepath", Encoding.UTF8); 

剛從meta & link標記,指示在HTML敏捷性包刪除標誌不自動關閉它們,也不要設置OptionWriteEmptyNodestrue

它會產生這樣(注意,這是略有不同):

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"></meta> 
    <link rel="stylesheet" href="main.css" type="text/css"></link> 
    </head> 
    <body>lots of text here, obviously not relevant to this problem</body> 
</html> 
+0

謝謝,這作爲解決方法看起來不錯。與此同時,在codeplex論壇上也發現了這個問題,但沒有解決,但我相信它很快就會被修復。 – Alex

1

設法做到解決方法的另一種方式這個問題。在我的情況下,這比上面的更好。基本上,我們正在取代DocumentNode,這是XML聲明的第一個孩子。(請注意,輸入必須包含XML聲明,在我的情況下,它是100%)

HtmlDocument htmlDoc = new HtmlDocument(); 
htmlDoc.OptionWriteEmptyNodes = true; 
htmlDoc.Load("sourcepath"); 

var newNodeStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; 
var newNode = HtmlNode.CreateNode(newNodeStr); 

htmlDoc.DocumentNode.ReplaceChild(newNode, htmlDoc.DocumentNode.FirstChild); 


htmlDoc.Save("destpath", Encoding.UTF8); 

請注意,西蒙的變通辦法太多,所以採取一個更適合你的情況。

0

我的頁面也有<br/>標籤,並且刪除htmlDoc.OptionWriteEmptyNodes = true;將其替換爲<br>。我發現類似Alex的答案的做法,但更多的普通了一點,所以,保持最原始值,並且不依賴於有總是被在頁面中的XML標籤:

HtmlDocument doc= new HtmlDocument(); 
doc.OptionWriteEmptyNodes = true; 
doc.Load("pathToFile"); 
if (doc.DocumentNode.FirstChild.OriginalName.Equals("?xml")) 
{ 
    var fixedOuterHtml = doc.DocumentNode.FirstChild.OuterHtml.Replace('/', '?'); 
    var newNode = HtmlNode.CreateNode(fixedOuterHtml); 
    doc.DocumentNode.ReplaceChild(newNode, doc.DocumentNode.FirstChild); 
}