如何从一个大字符串中返回一个单词
本文关键字:一个 返回 单词 字符串 | 更新日期: 2023-09-27 17:58:23
这可能很简单,但我似乎找不到实现这一点的方法。
我正在使用必应地图服务从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>
有没有一种简单的方法可以获取两个地方标签之间的城市名称?
我真的很惊讶人们在这里使用regex和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());
}
请注意,您可能需要为必应使用的xmlns声明一个名称空间解析程序。由于我没有XML的那个部分,所以我不能在这个例子中添加它,但这些东西很容易添加。
解析这种字符串的一种简单方法是使用字符串。方法索引
// 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之后你会有两个问题。
您可以通过创建一个常量字符串变量作为正则表达式的字符串来实现这一点。试试这个
const string HTML_TAG_PATTERN = "<.*?>";
static string StripHTML(string inputString)
{
return Regex.Replace
(inputString, HTML_TAG_PATTERN, string.Empty);
}
把它叫到你想得到城市名称的地方
string cityname = StripHTML(the code);
我还建议您对此使用适当的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>";
}
}
}