1

我正在尝试与一个非常糟糕的“网络服务”(巧妙地伪装成简单的 aspx 页面......)进行交互,但我不控制页面,所以我无法调整输出,所以我坚持使用它。格式始终是这样的:

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

所以,我需要解析出URL, Name, Address, City, State, 和Phone? 它不是真正正确形成的 XML,所以我不能使用 XML 解析器,而且 RegEx 看起来非常讨厌,所以我是否坚持String.Match等等IndexOf

谢谢你的建议......詹姆斯

4

4 回答 4

2

您可以使用HTML解析器来解析页面,Html Agility Pack是一个免费且健壮的。或者您可以XQuery为 .Net 使用任何处理器,请查看此线程以了解regex用于解析 html 页面的缺点

于 2013-02-21T17:11:44.310 回答
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);

是的,这种方法是一种粗略的黑客攻击,但是,考虑到“非常糟糕的网络服务”的情况,我认为这是一个公平而直接的解决方案,尽管很乏味。

于 2013-02-21T17:13:13.717 回答
0

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

于 2013-02-21T17:13:43.113 回答
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 解析器并循环获取数据。

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

于 2013-02-21T17:15:14.590 回答