如何从大字符串中返回一个字
这可能很简单,但我似乎无法找到一种方法来做到这一点。如何从大字符串中返回一个字
我正在使用必应地图服务从lat/long获取城市名称。
它给了我,我已经下载了像这样的字符串大量的XML:
<Name>
High Street, Lincoln, LN5 7
</Name>
<Point>
<Latitude>
53.226592540740967
</Latitude>
<Longitude>
-0.54169893264770508
</Longitude>
</Point>
<BoundingBox>
<SouthLatitude>
53.22272982317029
</SouthLatitude>
<WestLongitude>
-0.55030130347707928
</WestLongitude>
<NorthLatitude>
53.230455258311643
</NorthLatitude>
<EastLongitude>
-0.53309656181833087
</EastLongitude>
</BoundingBox>
<EntityType>
Address
</EntityType>
<Address>
<AddressLine>
High Street
</AddressLine>
<AdminDistrict>
England
</AdminDistrict>
<AdminDistrict2>
Lincs
</AdminDistrict2>
<CountryRegion>
United Kingdom
</CountryRegion>
<FormattedAddress>
High Street, Lincoln, LN5 7
</FormattedAddress>
<Locality>
Lincoln
</Locality>
<PostalCode>
LN5 7
</PostalCode>
</Address>
有刚开的城市名称是在这两个地方标记之间的简单方法?
一个简单的方法来解析那种串的 试试这个
const string HTML_TAG_PATTERN = "<.*?>";
static string StripHTML(string inputString)
{
return Regex.Replace
(inputString, HTML_TAG_PATTERN, string.Empty);
}
调用它是通过使用string.IndexOf方法
// I have saved your xml in this file to test
string xmlResult = File.ReadAllText(@"D:\temp\locality.txt");
int startPos = xmlResult.IndexOf("<Locality>");
int endPos = xmlResult.IndexOf("</Locality>");
if(endPos != -1 && startPos != -1)
{
string result = xmlResult.Substring(startPos + 10, endPos-startPos-10).Trim();
Console.WriteLine(result);
}
的搜索术语<Locality>
,然后搜索术语</Locality>
。如果在字符串中找到术语,则使用Substring方法提取所需的部分。 (10是<Locality>
的长度)
附注。尽管您的示例非常简单,但使用正则表达式解析XML或HTML文件是一种不好的做法。虽然与您的问题没有严格关联,但是this famous answer(SO最常见的一个)解释了为什么使用正则表达式来解析非常规语言并不是一个好主意。
如果你有一个问题,在正则表达式之后你会遇到两个问题。
这工作完美,谢谢你这么多! – samil90 2013-02-09 13:48:29
-1用于使用字符串操作来解析xml。 – 2013-02-09 19:44:25
我其实很惊讶人们在这里使用正则表达式和像indexOf这样的东西。如果你像这样处理XML,你可能会遇到一个令人讨厌的惊喜或两个惊喜。如果Bing决定开始使用CData。
.NET幸好也有XML,这是一样易于使用的相当不错的支持,所以我一直使用:
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
var nav = doc.CreateNavigator();
var iterator = nav.Select(@"//Locality");
while (iterator.MoveNext())
{
Console.WriteLine("{0}", iterator.Current.InnerXml.Trim());
}
请注意,你可能需要声明一个命名空间的解析器Bing使用的xmlns。由于我没有这部分XML,所以在这个例子中我不能添加它,但是这些东西很容易添加。
我也建议您为此使用正确的XML解析。但是请注意,您提供的XML不适合用作XML文档,因为它具有多个根节点。不过,这很容易解决。
如果您使用XML解析,您将可以轻松地获取所有其他数据,而无需任何烦人的解析。
这是很容易做的,所以比滚动你自己的XML解析代码如果您真的应该使用它更强大:
这里是它假定你的XML是在一个行示例字符串变量称为XML:
string locality = XElement.Load(new StringReader("<Root>"+xml+"<Root>")).XPathSelectElement("Address/Locality").Value.Trim();
下面是一个适当的例子:
using System;
using System.IO;
using System.Xml.Linq;
using System.Xml.XPath;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// Fix original XML, which has multiple root nodes!
// We fix it just by enclosing it in a root level element called "Root":
string xml = "<Root>" + originalXml() + "</Root>";
// Read the XML as an XML element.
var xElement = XElement.Load(new StringReader(xml));
// Easily access 'Locality' or any other node by name:
string locality = xElement.XPathSelectElement("Address/Locality").Value.Trim();
Console.WriteLine("Locality = " + locality);
}
// Note: This XML isn't well-formed, because it has multiple root nodes.
private static string originalXml()
{
return
@"<Name>
High Street, Lincoln, LN5 7
</Name>
<Point>
<Latitude>
53.226592540740967
</Latitude>
<Longitude>
-0.54169893264770508
</Longitude>
</Point>
<BoundingBox>
<SouthLatitude>
53.22272982317029
</SouthLatitude>
<WestLongitude>
-0.55030130347707928
</WestLongitude>
<NorthLatitude>
53.230455258311643
</NorthLatitude>
<EastLongitude>
-0.53309656181833087
</EastLongitude>
</BoundingBox>
<EntityType>
Address
</EntityType>
<Address>
<AddressLine>
High Street
</AddressLine>
<AdminDistrict>
England
</AdminDistrict>
<AdminDistrict2>
Lincs
</AdminDistrict2>
<CountryRegion>
United Kingdom
</CountryRegion>
<FormattedAddress>
High Street, Lincoln, LN5 7
</FormattedAddress>
<Locality>
Lincoln
</Locality>
<PostalCode>
LN5 7
</PostalCode>
</Address>";
}
}
}
正则表达式是你的朋友,例如:(。*?)@” \ n \ n “ –
reinder
2013-02-09 13:15:48
嗨后退,该正则表达式不起作用 – samil90 2013-02-09 13:33:50