2013-02-09 129 views
1

这可能很简单,但我似乎无法找到一种方法来做到这一点。如何从大字符串中返回一个字

我正在使用必应地图服务从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> 

有刚开的城市名称是在这两个地方标记之间的简单方法?

+0

正则表达式是你的朋友,例如:(。*?)@” \ n \ n <\/Locality>“ – reinder 2013-02-09 13:15:48

+0

嗨后退,该正则表达式不起作用 – samil90 2013-02-09 13:33:50

回答

0

一个简单的方法来解析那种串的 试试这个

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最常见的一个)解释了为什么使用正则表达式来解析非常规语言并不是一个好主意。

如果你有一个问题,在正则表达式之后你会遇到两个问题。

+0

这工作完美,谢谢你这么多! – samil90 2013-02-09 13:48:29

+0

-1用于使用字符串操作来解析xml。 – 2013-02-09 19:44:25

0

您可以通过将常量字符串变量用作正则表达式的字符串来实现此目的。要得到这个城市的名字

string cityname = StripHTML(the code); 
+0

嗨nrsharma,谢谢你的回复。我不熟悉RegEx,该模式不起作用,只是返回整个String返回 – samil90 2013-02-09 13:36:34

+0

您必须循环访问xml节点,然后将值传递给函数StripHTML(值)一个接一个。它会给你确切的价值。 – nrsharma 2013-02-11 03:53:55

3

我其实很惊讶人们在这里使用正则表达式和像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,所以在这个例子中我不能添加它,但是这些东西很容易添加。

0

我也建议您为此使用正确的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>"; 
     } 
    } 
}