1

これはおそらく非常に単純ですが、これを行う方法が見つからないようです。

Bing Maps サービスを使用して、緯度/経度から都市名を取得しています。

次のような文字列としてダウンロードした大量の 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>

2 つの地域タグの間にある都市名を取得する簡単な方法はありますか?

4

4 に答える 4

3

ここで、人々が正規表現や indexOf のようなものを使用していることに、私は実際に驚いています。XML をそのように処理すると、1 つか 2 つの厄介な驚きに直面する可能性があります。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

また、これには適切なXML解析を使用することをお勧めします。ただし、指定したXMLには複数のルートノードがあるため、XMLドキュメントとして使用するための整形式ではないことに注意してください。ただし、これは簡単に修正できます。

XML解析を使用すると、面倒な解析を行うことなく、他のすべてのデータも簡単に取得できます。

これは非常に簡単で、可能であれば実際に使用する必要がある独自のXML解析コードよりもはるかに堅牢です。

XMLがxmlという文字列変数にあると仮定した1行の例を次に示します。

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 に答える
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で最も賛成されているものの1つ)は、正規表現を使用して非正規言語を解析するのがなぜ良い考えではないのかを説明しています。

問題が1つある場合、正規表現の後に2つの問題が発生します。

于 2013-02-09T13:39:35.823 に答える
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 に答える