如何从大字符串返回一个单词

时间:2013-02-09 13:14:52

标签: c# windows-phone-7 parsing bing-maps

这可能很简单,但我似乎找不到这样做的方法。

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

是否有一种简单的方法可以获取两个地点标签之间的城市名称?

4 个答案:

答案 0 :(得分: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的那部分,所以我不能在这个例子中添加它,但这些东西很容易添加。

答案 1 :(得分:0)

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

const string HTML_TAG_PATTERN = "<.*?>";

static string StripHTML(string inputString)
        {
            return Regex.Replace
              (inputString, HTML_TAG_PATTERN, string.Empty);
        }

将其称为您想要获取城市名称的地方

string cityname = StripHTML(the code);

答案 2 :(得分:0)

解析这种字符串的一种简单方法是使用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之一)解释了为什么使用Regex解析非常规语言不是一个好主意。

如果您遇到一个问题,在Regex之后您将遇到两个问题。

答案 3 :(得分: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>";
        }
    }
}