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

C# 如何从大字符串中返回一个单词,c#,windows-phone-7,parsing,bing-maps,C#,Windows Phone 7,Parsing,Bing Maps,这可能很简单,但我似乎找不到一种方法来做到这一点 我正在使用Bing地图服务从lat/long中获取城市名称 它为我提供了大量XML,我下载了这些XML作为字符串,如下所示: <Name> High Street, Lincoln, LN5 7 </Name> <Point> <Latitude> 53.226592540740967 </Latitude> <Longitude> -0.54169893264770508

这可能很简单,但我似乎找不到一种方法来做到这一点

我正在使用Bing地图服务从lat/long中获取城市名称

它为我提供了大量XML,我下载了这些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>

高街,林肯,LN57
53.226592540740967
-0.54169893264770508
53.22272982317029
-0.55030130347707928
53.230455258311643
-0.53309656181833087
地址
商业街
英格兰
林肯
大不列颠联合王国
高街,林肯,LN57
林肯
LN57

有没有一种简单的方法可以只获取位于两个Location标记之间的城市名称?

您可以通过创建一个常量字符串变量作为正则表达式的字符串来实现这一点。 试试这个


解析这种字符串的一种简单方法是使用

//我已将您的xml保存在此文件中以进行测试
字符串xmlResult=File.ReadAllText(@“D:\temp\locality.txt”);
int startPos=xmlResult.IndexOf(“”);
int endPos=xmlResult.IndexOf(“”);
如果(endPos!=-1&&startPos!=-1)
{
string result=xmlResult.Substring(startPos+10,endPos-startPos-10).Trim();
控制台写入线(结果);
}
搜索术语
,然后搜索术语
。如果在字符串中找到术语,则使用该方法提取所需的部分。(10是
术语的长度)

旁注。虽然您的示例非常简单,但使用正则表达式解析XML或HTML文件是一种不好的做法。虽然与您的问题没有严格的关系,(这是有史以来投票最多的问题之一),但请解释为什么使用正则表达式解析非正则语言不是一个好主意


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

我真的很惊讶人们在这里使用regex和indexOf之类的东西。如果您像那样处理XML,您可能会遇到一两个严重的意外,f.ex。如果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();
string locality=XElement.Load(新的StringReader(“+xml+”)).XPathSelectElement(“地址/位置”).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>";
        }
    }
}
使用系统;
使用System.IO;
使用System.Xml.Linq;
使用System.Xml.XPath;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
//修复原始XML,它有多个根节点!
//我们只需将其封装在名为“root”的根级元素中即可修复它:
字符串xml=“”+原始xml()+”;
//将XML作为XML元素读取。
var-xElement=xElement.Load(新的StringReader(xml));
//通过名称轻松访问“Location”或任何其他节点:
字符串locality=xElement.XPathSelectElement(“地址/位置”).Value.Trim();
Console.WriteLine(“Locality=”+Locality);
}
//注意:此XML格式不正确,因为它有多个根节点。
私有静态字符串originalXml()
{
返回
@"
高街,林肯,LN57
53.226592540740967
-0.54169893264770508
53.22272982317029
-0.55030130347707928
53.230455258311643
-0.53309656181833087
地址
商业街
英格兰
林肯
大不列颠联合王国
高街,林肯,LN57
林肯
LN57
";
}
}
}

正则表达式是您的朋友,例如:@“\n(.*?)\n”您好,reinder,regex不起作用。谢谢您的回复。我对RegEx不太熟悉,这种模式不起作用,只是返回了整个字符串。您必须循环使用xml节点,然后将值逐个传递给函数StripHTML(值)。它会给你确切的价值。
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());
}
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>";
        }
    }
}