2013-02-21 72 views
1

我想与一个非常糟糕的“网络服务”(巧妙伪装成简单的aspx页面......)交互,但我不控制页面,所以我不能调整输出我坚持下去。格式是始终不变的是这样的:C#文本匹配HTML

<b> 
    <a href=\"http://www.google.com/\" target=\"_blank\">Google Inc</a> 
</b> 
<br />123 North Main 
<br />Hume, ACT 
<br />(999) 888-8888 

所以,我需要解析出URLNameAddressCityStatePhone?这不是真正正确的XML,所以我不能使用XML解析器,而RegEx似乎很痛苦,所以我坚持使用String.MatchIndexOf等?

感谢您的建议... 詹姆斯

回答

2

你可以使用一个HTML解析器来解析页面,Html Agility Pack,是一个自由和强大的一个。或者你可以使用任何XQuery处理器对于.NET,请看看这个thread看到使用regex的缺点解析HTML页面

1

没有必要对一个正则表达式,假设HTML元素保持不变。我的解决方案是找到<b>, </b>, and <br />元素的索引,然后从一个索引到下一个索引获取子字符串。例如

int bStartIndex = html.IndexOf("<b>"); 
int bEndIndex = html.IndexOf("</b>)"); 
int urlSize = bEndIndex - bStartIndex - 3; 
string url = html.Substring(bStartIndex + 3, urlSize); 

是的,这种方法是粗黑客,但是,考虑到“非常糟糕的网络服务”的情况下,我认为这是一个公平的和直线上升的解决方案,虽然繁琐。

0

那么,在过去,我尝试了许多其他方式来使用框架方法来获取里面的值。但是这种格式太自定义了,所以我认为唯一的方法就是回应响应中的每一行,并且每当你得到一个值时它就会有url。只要你开始阅读
字符串,那么它就是地址,下一个城市状态等等。 出于任何原因,对象的属性顺序以不同的顺序行到达,代码将会失败。 我建议你(如果可能的话)至少从服务返回一个容易反序列化的JSON格式。在其他情况下,您应该构建自己的解串器来根据需要获取数据。

0

你可以使用Regex.Replace(如果这是永远格式完全相同的方式)像这样:

string crappyXML = 
"<b> 
    <a href=\"http://www.google.com/\" target=\"_blank\">Google Inc</a> 
</b> 
<br />123 North Main 
<br />Hume, ACT 
<br />(999) 888-8888"; 

string betterXML = Regex.Replace(crappyXML, "</b><br />", "</b><br>"); 

(您可能需要考虑的是空间,如果有之间的空间)

然后你betterXML看起来是这样的:

"<b> 
    <a href=\"http://www.google.com/\" target=\"_blank\">Google Inc</a> 
</b> 
<br>123 North Main 
<br />Hume, ACT 
<br />(999) 888-8888"; 

然后,你可以做另一个正则表达式:

betterXML = Regex.Replace(betterXML, "<br />", "</br><br>"); 

这将使它看起来像这样:

"<b> 
    <a href=\"http://www.google.com/\" target=\"_blank\">Google Inc</a> 
</b> 
<br>123 North Main 
</br><br>Hume, ACT 
</br><br>(999) 888-8888"; 

然后只是这样做:

betterXML += "</br>"; 

关闭最后一个标签。

再次,我的Regex.Replace代码都不占空白。您将不得不添加它。

从那里,您应该能够使用XML解析器并循环以获取您的数据。

我希望有帮助!让我知道任何问题。