여기 내가 가진 슈퍼 간단한 코드입니다 :
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로 설정되었습니다.
누구든지이 문제를 해결하는 방법을 알고 있습니까?
버그 같아. http://htmlagilitypack.codeplex.com에 신고해야합니다.
그래도 다음과 같은 버그를 해결할 수 있습니다.
HtmlNode.ElementsFlags.Remove("meta");
HtmlNode.ElementsFlags.Remove("link");
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.Load("sourcefilepath");
htmlDoc.Save("destfilepath", Encoding.UTF8);
Html 민첩성 팩을 자동으로 닫지 않도록 지시하는 meta
및 link
태그에서 플래그를 제거하고 OptionWriteEmptyNodes
를 true
설정하지 마십시오.
이것을 생성합니다 (약간 다르다는 점에 유의하십시오).
<?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>
이 문제를 해결하기위한 또 다른 방법을 수행 할 수있었습니다. 위의 경우보다 약간 더 잘 작동합니다. 기본적으로 우리는 XML 선언 인 DocumentNode의 첫 번째 하위 노드를 대체합니다 (입력에 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);
Simon의 해결 방법도 효과가 있으므로 시나리오에 더 잘 맞는 방법을 사용하십시오.