web-dev-qa-db-ja.com

HtmlAgilityPack置換ノード

ノードを新しいノードに置き換えたい。ノードの正確な位置を取得して完全に置き換えるにはどうすればよいですか?

次のことを試しましたが、ノードのインデックスを取得する方法や、ReplaceChild()を呼び出す親ノードがわかりません。

string html = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
HtmlDocument document = new HtmlDocument();
document.LoadHtml(html);

var bolds = document.DocumentNode.Descendants().Where(item => item.Name == "b");

foreach (var item in bolds)
{

    string newNodeHtml = GenerateNewNodeHtml();
    HtmlNode newNode = new HtmlNode(HtmlNodeType.Text, document, ?);
    item.ParentNode.ReplaceChild( )
}
22
Omar

新しいノードを作成するには、HtmlNode.CreateNode()ファクトリメソッドを使用します。コンストラクターを直接使用しないでください。

このコードはあなたのためにうまくいくはずです:

_var htmlStr = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
var doc = new HtmlDocument();
doc.LoadHtml(htmlStr);

var query = doc.DocumentNode.Descendants("b");
foreach (var item in query.ToList())
{
    var newNodeStr = "<foo>bar</foo>";
    var newNode = HtmlNode.CreateNode(newNodeStr);
    item.ParentNode.ReplaceChild(newNode, item);
}
_

クエリでToList()を呼び出す必要があることに注意してください。そうしないと失敗するように、ドキュメントを変更します。


この文字列に置き換えたい場合:

_"some text <b>node</b> <strong>another node</strong>"
_

問題は、それがもはや単一のノードではなく、一連のノードであるということです。 HtmlNode.CreateNode()を使用して問題なく解析できますが、最終的には、シーケンスの最初のノードのみを参照します。親ノードを使用して置き換える必要があります。

_var htmlStr = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
var doc = new HtmlDocument();
doc.LoadHtml(htmlStr);

var query = doc.DocumentNode.Descendants("b");
foreach (var item in query.ToList())
{
    var newNodesStr = "some text <b>node</b> <strong>another node</strong>";
    var newHeadNode = HtmlNode.CreateNode(newNodesStr);
    item.ParentNode.ReplaceChild(newHeadNode.ParentNode, item);
}
_
49
Jeff Mercado

同じことを達成するために、次のソリューションを実装しました。

var htmlStr = "<b>bold_one</b><div class='LatestLayout'><div class='olddiv'><strong>strong</strong></div></div><b>bold_two</b>";
var htmlDoc = new HtmlDocument();
    HtmlDocument document = new HtmlDocument();
    document.Load(htmlStr);

htmlDoc.DocumentNode.SelectSingleNode("//div[@class='olddiv']").Remove();
htmlDoc.DocumentNode.SelectSingleNode("//div[@class='LatestLayout']").PrependChild(newChild)

htmlDoc.Save(FilePath); // FilePath .html file with full path if need to save file.

したがって、オブジェクトを選択し、それぞれのHTMLオブジェクトを削除します

チリとして追加します。それぞれのオブジェクトの。

0
BJ Patel

使ってます HtmlDocument.DocumentNode新しく生成されたノードの場合。

string html = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
HtmlDocument document = new HtmlDocument();
document.LoadHtml(html);
var bolds = document.DocumentNode.Descendants().Where(item => item.Name == "b");
foreach (var item in bolds)
{
    string newNodeHtml = GenerateNewNodeHtml();
    var nodeDocument = new HtmlDocument();
    nodeDocument.LoadHtml(newNodeHtml);
    item.ParentNode.ReplaceChild(nodeDocument.DocumentNode);
}
0
vicancy