2014-12-15 3 views
1

그래서 Windows Store App의 HTML을 Markdown으로 변환하는 코드를 작성하려고합니다. 지금까지 HtmlAgilityPack을 사용하여 많은 성공을 거두었지만 문제가 발생했습니다.HtmlAgilityPack으로 중첩 된 요소 처리

는 여기에 몇 가지 샘플 HTML

<p>A paragraph of text, including some text which is <strong>bolded</strong></p> 
<p>Another paragraph</p> 

의 나는 다음과 같은 코드를 사용하여이 문제를 처리합니다.

foreach (var x in doc.Descendants.Where(x => x.Name == "p").ToList()) 
{ 
    x.ParentNode.ReplaceChild(
     HtmlAgilityPack.HtmlNode.CreateNode(x.InnerHtml 
      + Environment.NewLine 
      + Environment.NewLine), 
     x); 
} 

예상 출력은

A paragraph of text, including some text which is <strong>bolded</strong> 

Another paragraph 

이다 그러나 실제 출력은 그냥 그 시점 이후에 모든 것을 무시 중첩 노드 안타 그것은 곧 것 같다

A paragraph of text, including some text which is 

Another paragraph 

입니다.

strong 태그를 처리하기 전에 규칙이 있으면 예상대로 출력됩니다. 그러나 "순서대로"일을하는 데 의존 할 수는 없습니다. p 내에서 p

내가 뭘 잘못하고 있니?

참고이 윈도우 스토어 앱을위한 것이며, 하지 지원 XPath에

답변

0

CreateNode 방법은 분석 된 HTML에서 첫 번째 형제를 반환하지 HTMLAgilityPack의 WinRT 버전을 사용합니다. 그래서 대담한 태그를 얻지 못할 것입니다. 따라서 모든 형제를 찾아서 당신의 반 노드 대신에 삽입하고 반 노드를 제거해야합니다.

이 코드는 당신이 시작할 수 있습니다 :

foreach (var x in doc.DocumentNode.Descendants().Where(x => x.Name == "p").ToList()) 
{ 
    var node = HtmlNode.CreateNode(x.InnerHtml + Environment.NewLine + Environment.NewLine); 
    foreach (var child in node.ParentNode.ChildNodes) 
    { 
     x.ParentNode.InsertBefore(child, x); 
    } 
    x.ParentNode.RemoveChild(x); 
} 
+0

당신이 옳다고 확신? 나는 아직 테스트를하지 않았지만 우리가 방금 생성 한 이후로'node'는 어떤 자식도 가지지 않을 것입니다. – roryok

+0

내 코드는 [CreateNode] (https://htmlagilitypack.codeplex.com/SourceControl/latest#Trunk/HtmlAgilityPack/HtmlNode.cs)의 원본 소스 코드를 기반으로합니다. HTML을 입력하면 새 노드를 만드는 동안 잃어 버리는 다른 태그가 포함될 수 있습니다. 나에게 바람직하지 않은 행동처럼 보이지만 그 문제가 해결 될 때까지 위의 코드에서 첫 번째보다는 모든 형제를 얻을 수 있습니다. 솔루션보다는 해결 방법입니다. –

+0

네,하지만 예제에서는 CreateNode로'node'라는 텍스트 노드를 만든 다음'node.ParentNode.ChildNodes'를 즉시 반복합니다. 그 시점에서'node'에는 부모 나 자식이 없습니다? – roryok