私はこのような何かに行く内部HTMLを持っている2つのノードがあります:
Node1:
<p>some text</p>
<p>some more text</p>
ノード2:
<p>some text</p>
<p>some more text</p>
<div><p>lots of more paragraphs here</p></div>
最初の2つの段落(またはNode1で提供されるHTMLテキスト)に続いて<!--more-->
タグ(WordPressの投稿用)を追加するために、Node2でNode1を検索しようとしています。
上記のノードの両方には異なる親があります。この場合、 <!--more-->
タグを見つけて置き換えたり、追加したりするにはどうしたらいいですか?次のコードを実行しようとしましたが、エラーが発生しました:
コード:
node2.ParentNode.ReplaceChild(HtmlNode.CreateNode(node1.InnerHtml & "<!--more-->"), node1).InnerHtml
エラー:
Node "
" was not found in the collection
Parameter name: node
また、oldChild部分のnode1
をHtmlNode.CreateNode(node1.InnerHtml)
にHtmlNode.CreateNode(node1.InnerHtml)
しようとしましたが、それもうまくHtmlNode.CreateNode(node1.InnerHtml)
ませんでした。
私は、 HtmlNode.InnerHtml
プロパティの置換を直接行うほうが簡単だと思います:
node2.InnerHtml = node2.InnerHtml.Replace(
node1.InnerHtml,
node1.InnerHtml + "<!--more-->"
);
置き換えがうまくいかない理由はわかっていますが、使用できるInsertAfterメソッドがあります。
const string html = @"<p>some text</p>
<p>some more text</p>
<div><p>lots of more paragraphs here</p></div>";
var doc = new HtmlDocument();
doc.LoadHtml(html);
var secondParagraph = doc.DocumentNode.SelectSingleNode("//p[2]");
// var secondParagraph = doc.DocumentNode.Descendants("p").Skip(1).First(); //or Linq
var moreNode= HtmlNode.CreateNode("<!--more-->");
doc.DocumentNode.InsertAfter(moreNode,secondParagraph );