2012-03-08 11 views
0

のすべての値を取得するためにHTMLAgilityPackを使用すると、私がこれまで持っているものです。ここでselect要素

  HtmlAgilityPack.HtmlDocument ht = new HtmlAgilityPack.HtmlDocument(); 


     TextReader reader = File.OpenText(@"C:\Users\TheGateKeeper\Desktop\New folder\html.txt"); 
     ht.Load(reader); 

     reader.Close(); 

     HtmlNode select= ht.GetElementbyId("cats[]"); 


     List<HtmlNode> options = new List<HtmlNode>(); 

     foreach (HtmlNode option in select.ChildNodes) 
     { 
      if (option.Name == "option") 
      { 
       options.Add(option); 
      } 
     } 

は、今私は、select要素のすべての「オプション」のリストを持っています。キーとテキストを取得するには、どのプロパティにアクセスする必要がありますか?

例えばあれば1つのオプションのHTMLは次のようになります。

<option class="level-1" value="1">Funky Town</option> 

私は出力として取得したい:

1 - Funky Town 

おかげ

編集:私はちょうど何かに気づきました。私は "Select"要素の子要素を取得すると、 "option"型の要素と "#text"型の要素を返しました。

Hmmm .. #textには必要な文字列がありますが、selectには値があります。

HTMLAgilityPackはhtmlパーサでしたか?なぜそれは私にこのような混乱する価値を与えましたか?

+0

ソースファイルからhtmlの一部を投稿できますか? – lincolnk

答えて

2

これは、htmlパーサーのデフォルトの設定によるものです。 <option>はHtmlElementFlag.Emptyとして構成されています(コメントに '時には含まれていますが、時には...'もありません)。 <form>タグには、同じセットアップ(CanOverlap + Empty)があり、子ノードなしでdomに空のノードとして表示されます。

ドキュメントを解析する前に、そのフラグを削除する必要があります。

HtmlNode.ElementsFlags.Remove("option"); 

ElementsFlagsプロパティは静的であり、すべての変更がそれ以降のすべての解析に影響することに注意してください。

+0

神はあなたを祝福します! – TheGateKeeper

0

編集:おそらくoptionノードをxpath経由で直接選択する必要があります。これでうまくいくはずだと思います。

var options = select.SelectNodes("option"); 

これは、テキストノードなしのオプションを取得します。オプションはあなたがどこかで望むその文字列を含むべきです。あなたのhtmlサンプルを待っています。あなたはそれが存在することを確認する属性にチェックをいくつかの正気を追加することができます


foreach (var option in options) 
{ 
    int value = int.Parse(option.Attributes["value"].Value); 
    string text = option.InnerText; 

}。

+0

それは私が頑張ったものですが、各項目のinnerTextは ""です。 – TheGateKeeper

+0

ええと、私はInnerTextを使用しています、それは私のために働く。たぶん 'option.FirstChild'を見て、それが存在するかどうか/あなたの価値があるかどうかを見てください。 – lincolnk

+0

質問を見て、更新しました。 – TheGateKeeper

関連する問題