2011-11-25 17 views
23

Chcę zastąpić wewnętrzny tekst tagów HTML innym tekstem. Używam HtmlAgilityPack
używam tego kodu, aby wyodrębnić wszystkie tekstyHtmlAgilityPack węzeł zestawu InnerText

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 ? 
} 

Ale innerText jest tylko do odczytu. Jak mogę zastąpić teksty innym tekstem i zapisać je do pliku?

+0

wewnętrzny tekst elementem jest połączenie wszystkich dzieci tagi tekst wewnętrzną. Czy chcesz zamienić wszystkie tagi dla dzieci na węzeł tekstowy? –

+0

@YuriyRozhovetskiy Chcę zastąpić tekst każdego elementu tekstem rzeczywiście chcę przetłumaczyć stronę na inny język. Chcę wyodrębnić cały tekst ze strony, a następnie przetłumaczyć, zastąpić i zapisać. – Shahin

+2

To dziwne, że dokumentacja XML mówi, że ta właściwość 'Pobiera lub ustawia tekst pomiędzy znacznikami początkowym i końcowym obiektu.", Ale zapewnia tylko metodę 'get' ... – BrainSlugs83

Odpowiedz

19

Wypróbuj poniższy kod. Wybiera wszystkie węzły bez elementów podrzędnych i odfiltrowuje węzły skryptów. Może musisz dodać dodatkowe filtrowanie. Oprócz wyrażenia XPath ten również szuka węzłów liści i odfiltrowuje zawartość tekstową tagów <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); 
} 
+0

Bardzo, dziękuję. jak mogę nadpisać przetłumaczony html na poprzedni plik? Załaduję węzły z pliku/ – Shahin

+0

Got It! Doc.save .. Wielkie dzięki:] – Shahin

+0

Jeśli to możliwe, proszę opisać, jaka jest różnica między moim XPath i twoim kodem? – Shahin

10

Dziwne, ale okazało się, że InnerHtml nie jest tylko do odczytu. A gdy próbowałem ustawić to tak

aElement.InnerHtml = "sometext"; 

wartość InnerText zmienił również "sometext"

+1

Ale masz szansę na zmianę tagów html również – jnoreiga

+3

InnerHtml nie jest tylko do odczytu. InnerText to. Dokumentacja wydaje się błędna, ponieważ InnerText nie jest tylko do odczytu. – liang

+0

Podczas gdy 'InnerHtml' obsługuje get/set, w niektórych sytuacjach nie zawsze wydaje się, że faktycznie zmienia treść dokumentu. Jeśli ją ustawisz, a następnie spojrzysz na "OuterHtml" dokumentu, zawartość nie zawsze jest zmieniana. – Memetican

Powiązane problemy