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

는 그냥 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> 
+0

감사합니다,이 해결 방법으로 좋아 보이고 있습니다. 그 동안에도 아직 해결책이 없어도 codeplex 포럼에서이 문제가 발견되었지만 곧 수정 될 것입니다. – Alex

1

이 문제를 해결하는 또 다른 방법을 할 수 있었다. 위의 경우보다 약간 더 잘 작동합니다. 기본적으로 우리는 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); 

시몬의 해결 방법은 작품도 있습니다 , 그래서 당신의 시나리오에 더 잘 맞는 것을 가져 가라.

0

내 페이지에도 <br/> 태그가 있고 htmlDoc.OptionWriteEmptyNodes = true; 태그를 제거하면이 태그를 <br>으로 바꿉니다. 나는 알렉스의 대답과 유사한 접근 방법을 발견했지만, 좀 더 일반적인 그래서 원래 값의 대부분을 유지하고, 항상 거기 페이지에서 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); 
} 
관련 문제