2011-01-06 11 views
3

どうすればいいですか? .InnerTextプロパティ(contains div要素で使用されている場合)は、私にHTMLのみを与えています。すべてのli要素を反復して値を抽出することはできますか?HTMLリストの内容をテキストに転送する

+0

このXHTMLは(十分に形成されています。 XML文書)?はいの場合、優雅な解決策が存在します。 –

+0

@Dimitre Novatchev - DoctypeはHTML 5であり、有効なコードです。 – Radu

+0

これは良い質問です(私の+1)。私の答えは、あなたの質問に対する残りの回答よりも優れた選択肢を提供すると信じています。 :) –

答えて

1

は、それが含まれているすべての のli要素を反復処理と を抽出することができます彼らの価値? OPのコメントから

DOCTYPEがHTML 5であり、有効な コードです。 - ラドゥつだけ次のXPath式使用することができ、この場合

:これは任意div要素の子孫であるすべてのli要素の子孫であるすべてのテキストノードを選択

div//li//text() 

を現在のノードの子。

XPath式を使用してXMLでノードを選択すると(HTML5は整形式のXMLです)、構築が難しく、テストが難しく、理解しにくく、保守が難しいという理由で、最も簡単で信頼性の高い方法です正規表現。ここ

は、完全なコード例ある:

using System; 
using System.Xml; 

class TestXPath 
{ 
    static void Main(string[] args) 
    { 
     string html5Text = 
@"<html> 
<head> 
</head> 
<body> 
    <div> 
    <ul> 
    <li>Line 1</li> 
    <li>Line 2</li> 
    <li>Line 3</li> 
    </ul> 
    </div> 
</body> 
</html>"; 

     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(html5Text); 

     string xpathExpr = @"/*/*/div//li//text()"; 

     XmlNodeList selection = doc.SelectNodes(xpathExpr); 

     foreach (XmlNode node in selection) 
     { 
      Console.WriteLine(node.OuterXml); 
     } 

    } 
} 

上記アプリケーションが実行されたとき、所望の、正しい結果が製造される:

Line 1 
Line 2 
Line 3 
+0

絶対に素晴らしい。 – Radu

+0

@ラジード:どうぞよろしくお願いいたします。 –

0

あなたは常に簡単なregExと「ブルートフォース」それを、または文字列を分割終了タグ

+4

私はhtmlを解析するために正規表現を使用しないように条件付けられました。常に涙で終わります。 – Radu

+0

私はあなたに同意する傾向がありますが、あなたのコメントに+1をくれましたが、私はまだHTMLを解析するためにRegExを使用する傾向があり、多くの時間を泣いています... – Peter

0

は/初めに基づくことができ、私はULをループするためにjQueryのを使用し、各LIの値を返すことができた場合。 uは、これらの値のサーバー側が必要な場合は、これらの線に沿って何か...もちろん

$('li').each(function() { 

    alert($(this).html()); 

}); 

は、ページメソッドまたはWebサービスへのAJAX呼び出しのいくつかの並べ替えが必要であろう。

+0

残念ながら不可能です。私はページメソッドを呼び出そうとしましたが、サーバー側で生成されたヘッダーを使用する必要があるため、私の場合は動作しません。どうやら私はAJAXを介してそれらを渡そうとすると、彼らは単に無視されます。 – Radu

+0

@Raduページメソッドではなく単純なasmx Webサービスはどうですか? – stephen776

+0

私はそれを試していないが、私は特別なヘッダーを渡すことができると思いますか?私は動的に生成されたファイルのためのファイルダウンロードダイアログを表示しようとしています。これらのヘッダーは私の要求に置きます: '.AddHeader(" Content-disposition "、" attachment; filename = output.txt ")'と '。 AddHeader( "Content-length"、fileLength) '。問題はAJAXのリクエストそのものだと思うので、asmxサービスは役に立ちません。 – Radu

2

HTML Agilitypackこれをサーバー側で実行する必要がある場合は、HTML Agilitypackを使用してください。あなたがリストを持っていると仮定すると

var textList = convertUlToText('myId'); 
+0

非常に興味深い。 ulがjavascriptを使って追加された場合、これは動作しますか? – Radu

+0

いいえ、サーバー側に存在するHTMLは動作しません。 – jgauffin

+0

@jgauffin - element.InnerTextを実行してもHTMLコンテンツが正常に返されますか? – Radu

2

var nodes = doc.SelectNodes("//ul[@id=\"myId\"]/li"); 
List<string> items = new List<string>(); 
foreach (var node in nodes) 
    items.Add(node.InnerText); 

更新

(クライアント側のために)同じことをjqueryのスクリプト:

<script type="text/javascript"> 
    function convertUlToText(ulID) 
    { 
     var text = ''; 
     $('#' + ulID + ' li').each(function() { 
      text += $(this).html() + '\r\n'; 
     } 
     return text; 
    } 
</script> 

使い方別の変数(あなたがそれを抽出した)、そしてそれとの間に何もない/リチウムと次リーエン:

string[] sep = {"</li>"}; 
foreach (string s in html.Replace("<li>","").Split(sep, StringSplitOptions.None)) 
//do something with s 

試験のためのような単純なコンソールアプリケーション:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string html = "<li>123</li><li>456</li>"; 
      string[] sep = {"</li>"}; 
      foreach (string s in html.Replace("<li>","").Split(sep, StringSplitOptions.None)) 
       Console.WriteLine(s); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

これは動作しますが、それはvladの解決策と同じ問題があります。私はそれが技術的にそれを処理する最善の方法ではないにもかかわらず、これを行うことがあります。 – Radu

関連する問題