2011-11-25 9 views
23

HTMLタグの内部テキストを別のテキストに置きたいと思います。 私はすべてのテキストHtmlAgilityPackセットノード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 ? 
} 

を抽出するために、このコードを使用ししかし、InnerTextプロパティが読み取り専用であるHtmlAgilityPack
を使用しています。テキストを別のテキストに置き換えてファイルに保存するにはどうすればよいですか?

+0

に変更し、要素の内部テキストは、すべての子どもの組み合わせは、内部テキストをタグです。すべての子タグをテキストノードに置き換えますか? –

+0

@YuriyRozhovetskiyそれぞれの要素テキストをテキストに置き換えたいのですが、実際にはWebサイトを別の言語に翻訳したいと思っています。 ページからすべてのテキストを抽出し、翻訳、置換、保存したいと考えています。 – Shahin

+2

XMLドキュメントでは、このプロパティが 'オブジェクトの開始タグと終了タグの間のテキストを取得または設定します.'というメッセージが表示されていますが、' get'メソッドしか提供していないことは間違いです。 – BrainSlugs83

答えて

19

下記のコードを試してください。これは、子なしのすべてのノードを選択し、スクリプト・ノードを除外します。たぶん追加のフィルタリングを追加する必要があります。 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); 
} 
+0

翻訳済みのHTMLを前のファイルに上書きするにはどうしたらいいですか? ファイルからノードをロードする/ – Shahin

+0

これを取得しました! Doc.save ..ありがとうございます:] – Shahin

+0

可能であれば、私のコードXPathとあなたの違いは何ですか? – Shahin

10

奇妙ですが、InnerHtmlが読み取り専用ではないことが判明しました。私はその

aElement.InnerHtml = "sometext"; 

ようにそれを設定しようとしたときInnerTextの値も"sometext"

+1

しかし、htmlタグを変更する可能性もあります – jnoreiga

+3

InnerHtmlは読み取り専用ではありません。 InnerTextはです。 InnerTextが読み込み専用でないと、ドキュメントが間違っているように見えます。 – liang

+0

'InnerHtml'はget/setをサポートしていますが、特定の状況では実際にドキュメントの内容を変更するとは限りません。それを設定して、文書の 'OuterHtml'を見ると、内容は必ずしも変更されません。 – Memetican