OptionWriteEmptyNodes brechen die XML-Deklaration mit HtmlAgilityPack

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

Frage

Hier ist der super einfache Code, den ich habe:

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

Eingang:

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

Ausgabe:

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

Sie können sehen, dass in der ersten Zeile ein Fehler auftritt: /> statt?> Dies passiert, wenn ich OptionWriteEmptyNodes auf True-Wert setze. Es wurde auf "true" gesetzt, da sonst Meta / Link-Tags (und einige andere im Dokumententext) nicht geschlossen werden.

Weiß jemand, wie man das löst?

Akzeptierte Antwort

Scheint wie ein Fehler. Sie sollten es auf http://htmlagilypack.codeplex.com melden.

Trotzdem können Sie den Fehler wie folgt umgehen:

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

Entfernen Sie einfach die Flags aus den meta und link Tags, die das Html Agility Pack anweisen, sie nicht automatisch zu schließen, und setzen Sie OptionWriteEmptyNodes auf true .

Es wird dies erzeugen (beachten Sie, das ist etwas anders):

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

Beliebte Antwort

Es wurde eine andere Möglichkeit zur Umgehung dieses Problems bereitgestellt. Das funktioniert in meinem Fall etwas besser als das obige. Im Grunde ersetzen wir das erste Kind des DocumentNode, das ist die XML-Deklaration (Bitte beachten Sie, dass die Eingabe die XML-Deklaration enthalten muss, in meinem Fall ist es 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);

Bitte beachten Sie, dass Simons Workaround auch funktioniert, also nehmen Sie den, der besser in Ihr Szenario passt.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum