2012-07-06 88 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