1

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

我正在使用 Bing 地图服务从纬度/经度获取城市名称。

它给了我大量的 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

4 回答 4

3

我真的很惊讶人们在这里使用正则表达式和 indexOf 之类的东西。如果您像 f.ex 那样处理 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 的那部分,所以我不能在这个例子中添加它,但是这些东西很容易添加。

于 2013-02-09T14:07:29.067 回答
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);
于 2013-02-09T13:19:03.460 回答
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 文件是一种不好的做法。虽然与您的问题没有严格相关,但这个著名的答案(SO 上最受好评的答案之一)解释了为什么使用 Regex 解析非正则语言不是一个好主意。

如果你有一个问题,在 Regex 之后你会遇到两个问题。

于 2013-02-09T13:39:35.823 回答
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>";
        }
    }
}
于 2013-02-09T14:13:42.320 回答