Питання HtmlAgilityPack встановлює вузол InnerText


Я хочу замінити внутрішній текст тегів HTML іншим текстом. Я використовую HtmlAgilityPack
 Я використовую цей код для вилучення всіх текстів

HtmlDocument doc = new HtmlDocument();
doc.Load("some path")

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//text()[normalize-space(.) != '']")) {
    // How to replace node.InnerText with some text ?
}

Але InnerText читається тільки. Як я можу замінити тексти іншим текстом і зберегти їх у файл?


24
2017-11-25 21:34


походження


Внутрішній текст елемента - це комбінація всіх внутрішніх текстів тегів для дітей. Ви хочете замінити усі теги дітей на текстовий вузол? - Yuriy Rozhovetskiy
@YuriyRozhovetskiy Я хочу замінити кожен елемент текстом текстом, хоча я хочу перекласти веб-сайт на іншу мову. Я хочу витягнути весь текст з сторінки, потім перекладати, замінити та зберегти. - Shahin
Дивно, що документація XML говорить про це властивість Gets or Sets the text between the start and end tags of the object. але тоді лише забезпечує a get метод ... - BrainSlugs83


Відповіді:


Спробуйте код нижче. Він виділяє всі вузли без дітей та відфільтровує вузли скриптів. Можливо, потрібно додати додаткову фільтрацію. Крім вашого виразу XPath це також шукає листя вузлів і відфільтрувати текстовий вміст <script> мітки

var nodes = doc.DocumentNode.SelectNodes("//body//text()[(normalize-space(.) != '') and not(parent::script) and not(*)]");
foreach (HtmlNode htmlNode in nodes)
{
    htmlNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(htmlNode.InnerText + "_translated"), htmlNode);
}

19
2017-11-25 22:56



Дуже добре, дякую. Як я можу перезаписати перекладене HTML у попередній файл? Я завантажую вузли з файлу / - Shahin
Зрозумів ! Doc.save .. Велике спасибі:] - Shahin
Якщо можливо, будь ласка, просто опишіть різницю між моїм кодом XPath і вашим? - Shahin
Я додав кілька пояснень - Yuriy Rozhovetskiy
Просто для додаткового з'ясування, що правильний спосіб встановлення тексту в вузол, замінюючи HtmlTextNode з новим, який створений з HtmlTextNode.CreateNode("text here...") - KFL


Дивно, але я виявив, що InnerHtml не читається. І коли я намагався встановити це так

aElement.InnerHtml = "sometext";

вартість InnerText також змінився на "sometext"


11
2018-02-28 19:03



Але ви також можете змінити теги html - jnoreiga
InnerHtml не читається. InnerText є. Документація здається неправильним, оскільки InnerText не читається. - liang
Поки InnerHtml підтримує "get / set", в деяких ситуаціях не завжди здається, що вони дійсно змінюють зміст документа. Якщо ви встановите його, а потім перегляньте документ OuterHtml, зміст не завжди змінюється. - Memetican