OptionWriteEmptyNodes rompt la déclaration XML à l'aide de HtmlAgilityPack

c# end-tag html-agility-pack non-well-formed xml-declaration

Question

Voici le code super simple que j'ai:

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

Contribution:

<?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>

Sortie:

<?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>

Vous pouvez voir que dans la première ligne il y a une erreur: /> au lieu de?> Ceci se produit si je mets OptionWriteEmptyNodes sur true. Il a été défini sur true, car sinon les balises meta / link (et d'autres dans le corps du document) ne seront pas fermées.

Quelqu'un sait comment résoudre ce problème?

Réponse acceptée

On dirait un bug. Vous devez le signaler à http://htmlagilitypack.codeplex.com .

Néanmoins, vous pouvez contourner ce bogue comme ceci:

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

Supprimez simplement les indicateurs des balises meta & link qui OptionWriteEmptyNodes au pack d'agilité HTML de ne pas les fermer automatiquement et ne définissez pas OptionWriteEmptyNodes sur true .

Cela produira ceci (notez que c'est légèrement différent):

<?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>

Réponse populaire

A réussi à faire une autre façon de contourner ce problème. Cela fonctionne légèrement mieux dans mon cas que celui ci-dessus. Fondamentalement, nous remplaçons le premier enfant du DocumentNode, qui est la déclaration xml.

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);

Veuillez noter que la solution de contournement de Simon fonctionne également; prenez donc celui qui convient le mieux à votre scénario.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi