2014-07-22 99 views
1

使用htmlagility,我正在搜索由select組成的dom結構中的文本節點。htmlagilitypack文本節點的父級是選擇而不是選項?

<select> 
    <option> 
    one 
    </option> 
    <option> 
    two 
    </option> 
</select> 

這些節點的父母似乎是

<select> 

代替

<option> 

爲什麼?

using System.IO; 
using System.Linq; 
using HtmlAgilityPack; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

namespace Foo.Test 
{ 
    [TestClass] 
    public class HtmlAgilityTest 
    { 
    [TestMethod] 
    public void TestTraverseTextNodesInSelect() 
    { 
     var html = "<select><option>one</option><option>two</option></select>"; 

     var doc = new HtmlDocument(); 
     doc.Load(new StringReader(html)); 

     var elements = doc.DocumentNode.Descendants().Where(n=>n.Name == "#text"); 

     Assert.AreEqual(2, elements.Count()); 
     Assert.AreEqual("select", elements.ElementAt(0).ParentNode.Name); 
     Assert.AreEqual("select", elements.ElementAt(1).ParentNode.Name); 
    } 
    } 
} 
+0

這將是很清楚,爲什麼HAP工作這樣,如果你能看到HAP如何讀取HTML:'Console.WriteLine(doc.DocumentNode.OuterHtml)' – har07

回答

1

那是因爲HtmlAgilityPack drop closing <option> tag by default。 HAP看到你的HTML這樣的:

Console.WriteLine(doc.DocumentNode.OuterHtml); 
//result : 
//<select><option>one<option>two</select> 

而且如上鍊接的問題中提到,您可以通過撥打以下行啓動HtmlDocument之前改變這種行爲:

HtmlNode.ElementsFlags.Remove("option"); 
+0

你知道

+0

設置爲因鏈接而解決,很難選擇哪個答案最好 –

2
[TestMethod] 
    public void TestTraverseTextNodesInSelect() 
    { 
     HtmlNode.ElementsFlags.Remove("option"); 
     var html = "<select><option>one</option><option>two</option></select>"; 

     var doc = new HtmlDocument(); 
     doc.Load(new StringReader(html)); 

     var elements = doc.DocumentNode.Descendants().Where(n=>n.Name == "#text"); 

     Assert.AreEqual(2, elements.Count()); 
     Assert.AreEqual("select", elements.ElementAt(0).ParentNode.Name); 
     Assert.AreEqual("select", elements.ElementAt(1).ParentNode.Name); 
    } 

你可以用這個試試。

在圖書館它有這樣的。你需要刪除它。默認情況下,AgilityPack設置爲將選項標籤視爲空。

ElementsFlags.Add("option", HtmlElementFlag.Empty); 
相關問題