contentEditable
을 사용하여 얻은 이상한 중첩 HTML을 수정하려고합니다.
<span lang="">
<p>line one</p>
<p>line two</p>
</span>
나는 각각의 span
노드를 그 자식으로 대체하려고한다.
<p>line one</p>
<p>line two</p>
여기 내가 시도한 것이있다.
var spans = doc.DocumentNode.Descendants().Where(x => x.Name == "span" && x.Attributes["lang"] != null).ToList();
foreach (var span in spans)
{
foreach (var child in span.ChildNodes)
{
var ch = doc.CreateElement(child.Name);
ch.InnerHtml = child.InnerHtml;
doc.DocumentNode.InsertBefore(ch, span);
}
span.Remove();
}
그러면 다음 메시지와 함께 System.ArgumentOutOfRangeException
이 throw됩니다.
Node "<span lang=""></span>" was not found in the collection
왜 이런 일이 일어 났는지 이해합니다. 문서를 편집하면 span
요소 모음이 무효화됩니다. 그럼 어떻게해야할까요?
또한, 어떻게 childnode에 포함되지 않은 텍스트에 대처합니까? 이 요소를 찾았다 고 가정 해 봅시다.
<span lang="">
<p>line one</p>
<p>line two</p>
line three
</span>
어떻게 그걸 비틀어 넣을 수 있니?
제발 참고 : 이 HtmlAgilityPack
WinRT
, SelectSingleNode
및 모든 xpath 명령을 사용할 수 없습니다.
문제에 관해서는 문서 루트가 아닌 부모 노드 에서 InsertBefore
를 호출해야합니다.
또한 새로운 노드를 만들지 않고 노드를 직접 " 이동할 "수 있다고 생각합니다.
foreach (var span in spans)
{
foreach (var child in span.ChildNodes)
{
span.ParentNode.InsertBefore(child, span);
}
span.Remove();
}