2012-07-06 86 views
2

我想分割一串html標籤。例如香港專業教育學院有一個字符串:String.Split with specific tags

<p></p> 

<table> 

<table><p></p></table> 


</table> 

我想以檢索的是:

<table> 

<table><p></p></table> 


</table> 

問題是現在,當我打電話:

string[] values = pContent.Split(new string[] {"<table>","</table>" }, StringSplitOptions.RemoveEmptyEntries); 

即時得到:

<table> 

    <table><p></p> 

我如何得到休息嗎?

+0

嘗試http://htmlagilitypack.codeplex.com/代替 – Chandu 2012-07-06 12:12:39

+1

拆分是不會做到這一點,甚至正則表達式將是痛苦的。 xml/html解析器是要走的路。 – 2012-07-06 12:15:17

+0

是否可以在xslt文件中使用html解析器? – Timsen 2012-07-06 12:20:55

回答

4

你可以試試下面的代碼:

 string input = String.Concat("<root>", @"<p></p><table><table><p></p></table></table>", "</root>"); 

     XDocument doc = XDocument.Parse(input); 
     var valuesStr = doc.Root.Element("table").ToString(); 
     string[] values = Regex.Matches(valuesStr, @"<.+?>") 
      .Cast<Match>() 
      .Select(o => o.Groups[0].Value) 
      .ToArray(); 

它首先創建的XDocument類(類解析XML之一)的一個實例,它增加了一個名爲「根」只是爲了能夠創建根元素XDocument(每個XML文檔都必須有一個根目錄)。 XML文檔的內容是從字符串中分析的。然後它得到包含文檔文本表示的字符串 - 首先要做Root屬性,因爲「table」元素剛好在根節點下面,之後調用帶有「table」的Element()方法獲取第一個元素在根節點下面有名字「table」(在這個例子中,節點下面只有一個這樣的元素),然後ToString()獲得文本描述。

Regex.Matches用於從字符串中提取每個單獨的元素,它返回MatchCollection,然後通過Cast()將其轉換爲IEnumerable,然後在IEnumerable上調用Select()擴展方法,該方法獲取文本值對於IEnumerable中的每個匹配,使用Regex.Matches,然後通過ToArray()方法將這些值作爲string []返回。

+0

,我們獲得了勝利者。你能解釋你做了什麼嗎? – Timsen 2012-07-06 12:52:28

+0

當然,我再次讀到這個問題,並且認爲用'string [] values = doc.Root.Descendants(「table」)來替換答案。Select(o => o.ToString())。ToArray() ;'這將返回所有名爲「table」的元素,但如果這是所需的結果,那麼就可以。我會給解答添加解釋。 – 2012-07-06 12:59:50

+0

thatnks很多exexlnation,從未使用XDocument之前 – Timsen 2012-07-07 20:41:06