OptionWriteEmptyNodes는 HtmlAgilityPack을 사용하여 XML 선언을 중단합니다.

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

문제

여기 내가 가진 슈퍼 간단한 코드입니다 :

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

입력:

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

산출:

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

첫 줄에 오류가 있음을 알 수 있습니다 : /> 대신?>이 경우 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 민첩성 팩을 자동으로 닫지 않도록 지시하는 metalink 태그에서 플래그를 제거하고 OptionWriteEmptyNodestrue 설정하지 마십시오.

이것을 생성합니다 (약간 다르다는 점에 유의하십시오).

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

인기 답변

이 문제를 해결하기위한 또 다른 방법을 수행 할 수있었습니다. 위의 경우보다 약간 더 잘 작동합니다. 기본적으로 우리는 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의 해결 방법도 효과가 있으므로 시나리오에 더 잘 맞는 방법을 사용하십시오.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.