我正在尝试与一个非常糟糕的“网络服务”进行交互(巧妙地伪装成简单的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
等?
感谢您的建议...... 詹姆斯
答案 0 :(得分:2)
您可以使用HTML
解析器来解析页面Html Agility Pack,这是一个免费且健壮的页面。或者您可以使用.Net的任何XQuery
处理器,请查看此thread以查看使用regex
解析html页面的缺点
答案 1 :(得分: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);
是的,这种方法是粗暴的,但是,考虑到“真正糟糕的网络服务”的情况,我认为这是一个公平而直接的解决方案,尽管很乏味。
答案 2 :(得分:0)
好吧,在过去,我尝试了许多其他方法来使用框架方法来获取内部值。但是这种格式太定制了,所以我认为唯一的方法是在响应中循环每一行,并且只要你得到一个值它就会有url。任何时候你开始读取行中的字符串,它将是地址,接下来是城市状态等等。 由于任何原因,对象的属性顺序到达不同的顺序行,代码将失败。 我建议你(如果可能的话)至少从服务中返回一个易于反序列化的JSON格式。在其他情况下,您应该构建自己的反序列化器以根据需要获取数据。
答案 3 :(得分: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解析器并循环来获取你的数据。
我希望有所帮助!让我知道任何问题。