Frage

Ich versuche, einige Informationen aus dem Google-Geocoding API zu analysieren, aber ich bin ein wenig Probleme, mit effizient die Daten aus dem XML zu bekommen. Siehe Link zum Beispiel

Alles, was ich wirklich über ist immer die short_name von address_component wo der Typ administrative_area_level_1 und die long_name von administrative_area_level_2 Aber mit meinem Testprogramm meiner XPath-Abfrage gibt keine Ergebnisse für beiden Abfragen.

public static void Main(string[] args)
{
    using(WebClient webclient = new WebClient())
    {
        webclient.Proxy = null;
        string locationXml = webclient.DownloadString("http://maps.google.com/maps/api/geocode/xml?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false");
        using(var reader = new StringReader(locationXml))
        {
            var doc = new XPathDocument(reader);
            var nav = doc.CreateNavigator();
            Console.WriteLine(nav.SelectSingleNode("/GeocodeResponse/result/address_component[type=administrative_area_level_1]/short_name").InnerXml);
            Console.WriteLine(nav.SelectSingleNode("/GeocodeResponse/result/address_component[type=administrative_area_level_2]/long_name").InnerXml);

        }
    }
}

Kann mir jemand helfen finden, was ich falsch mache, oder einen besseren Weg zu empfehlen?

War es hilfreich?

Lösung

Sie müssen den Wert des Knotens setzen Sie suchen in Anführungszeichen:

".../address_component[type='administrative_area_level_1']/short_name"
                            ↑                           ↑

Andere Tipps

Ich würde auf jeden Fall statt XPathNavigator mit LINQ to XML empfehlen. Es macht XML ein Kinderspiel, in meiner Erfahrung abfragt. In diesem Fall bin ich nicht sicher genau das, was falsch ist ... aber ich werde mit einer LINQ kommt bis zu XML statt Snippet.

using System;
using System.Linq;
using System.Net;
using System.Xml.Linq;

class Test
{
    public static void Main(string[] args)
    {
        using(WebClient webclient = new WebClient())
        {
            webclient.Proxy = null;
            string locationXml = webclient.DownloadString
                ("http://maps.google.com/maps/api/geocode/xml?address=1600"
                 + "+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false");
            XElement root = XElement.Parse(locationXml);

            XElement result = root.Element("result");
            Console.WriteLine(result.Elements("address_component")
                                    .Where(x => (string) x.Element("type") ==
                                           "administrative_area_level_1")
                                    .Select(x => x.Element("short_name").Value)
                                    .First());
            Console.WriteLine(result.Elements("address_component")
                                    .Where(x => (string) x.Element("type") ==
                                           "administrative_area_level_2")
                                    .Select(x => x.Element("long_name").Value)
                                    .First());
        }
    }
}

Nun ist diese is mehr Code 1 ... aber ich persönlich einfacher finden Recht als XPath zu bekommen, weil der Compiler hilft mir mehr.

EDIT: Ich glaube, es wert ist, in etwas mehr Detail zu gehen, warum ich im Allgemeinen bevorzugt Code wie folgt über XPath verwenden, obwohl es deutlich länger ist

.

Wenn Sie XPath in einem C # -Programm verwenden, haben Sie zwei verschiedene Sprachen - aber nur einer ist in der Steuerung (C #). XPath wird in das Reich der Saiten Absteiger: Visual Studio nicht einem XPath-Ausdruck eine besondere Behandlung nicht geben; es nicht verstehen , dass es ein XPath-Ausdruck zu sein, ist gemeint, so dass es Ihnen nicht helfen kann. Es ist nicht, dass Visual Studio nicht über XPath nicht kennt; wie Dimitre weist darauf hin, es ist durchaus in der Lage Fehler Spek, wenn Sie eine XSLT-Datei bearbeiten, nicht nur eine C # Datei.

Dies ist der Fall, wenn Sie eine Sprache in einer anderen eingebettet haben und das Werkzeug ist es nicht bewusst. Gängige Beispiele sind:

  • SQL
  • Reguläre Ausdrücke
  • HTML
  • XPath

Wenn Code als Daten in einer anderen Sprache dargestellt wird, die Sekundärsprache verliert viel von seinem Werkzeug Vorteilen.

Während Sie kann Kontext wechselt alle über den Ort, die XPath herausziehen (oder SQL oder reguläre Ausdrücke usw.) in ihre eigenen Werkzeuge (möglicherweise innerhalb desselben eigentlichen Programms, sondern in einer separaten Datei oder Fenster) ich finde, das macht für härtere zu lesende Code auf lange Sicht. Wenn Code wurden immer nur geschrieben und nie danach lesen, das könnte in Ordnung sein -. Aber Sie Sie müssen in der Lage sein Code später zu lesen, und ich persönlich die Lesbarkeit leidet glauben, wenn dies geschieht

Die LINQ to XML-Version über immer nur verwendet Strings für reine Daten - die Namen der Elemente usw. - und Anwendungscode (Methodenaufrufe) Aktionen darzustellen wie „Elemente mit einem bestimmten Namen finden“ oder „diese Filter anwenden“. Das ist mehr idiomatisch C # -Code, meiner Meinung nach.

Offensichtlich andere nicht diesen Standpunkt nicht teilen, aber ich dachte, es auf wert erweitern zu zeigen, wo ich komme.

Beachten Sie, dass dies nicht eine harte und schnelle Regel natürlich ... in einigen Fällen XPath, reguläre Ausdrücke usw. sind die beste Lösung. In diesem Fall würde ich die LINQ to XML bevorzugen, das ist alles.


1 Natürlich I könnte haben jede Console.WriteLine Anruf auf einer einzigen Linie gehalten, aber ich weiß nicht wie Buchungscode mit horizontalen Scrollbalken auf SO. Beachten Sie, dass die richtige XPath-Version mit der gleichen Vertiefung zu schreiben, wie die oben und Scrollen zu vermeiden noch ziemlich böse ist:

            Console.WriteLine(nav.SelectSingleNode("/GeocodeResponse/result/" +
                "address_component[type='administrative_area_level_1']" +
                "/short_name").InnerXml);

In der Regel lange Linien arbeiten viel besser in Visual Studio als sie auf Stack-Überlauf ...

würde ich empfehlen, nur die Eingabe den XPath-Ausdrucks als Teil einer XSLT-Datei in Visual Studio . Sie werden Fehlermeldungen erhalten „wie Sie“ - das ist ein ausgezeichneter XML / XSLT / XPath-Editor

.

Zum Beispiel, ich bin Typisierung:

<xsl:apply-templates select="@* | node() x"/>

und sofort im Fenster Fehlerliste erhält die folgende Fehlermeldung: :

Error   9   Expected end of the expression, found 'x'.  @* | node()  -->x<--

XSLTFile1.xslt  9   14  Miscellaneous Files

Nur wenn der XPath-Ausdruck wirft keine Fehler (ich könnte ich auch Test, dass es die beabsichtigten Knoten auswählt, auch), würde ich diesen Ausdruck setzte in meine C # -Code .

Damit wird sichergestellt, dass ich keine XPath haben - Syntax und Semantik -. Fehler, wenn ich die C # Programm ausführen

dtb Antwort korrekt. Ich wollte noch hinzufügen, dass Sie den richtigen XPath finden Tools wie den unten stehenden Link, um Hilfe zu testen verwenden XPath können:

http://www.bit-101.com/xpath/

string url = @"http://maps.google.com/maps/api/geocode/xml?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false";
string value = "administrative_area_level_1";

using(WebClient client = new WebClient())
{
    string wcResult = client.DownloadString(url);

    XDocument xDoc = XDocument.Parse(wcResult);

    var result = xDoc.Descendants("address_component")
                    .Where(p=>p.Descendants("type")
                                .Any(q=>q.Value.Contains(value))
                    );

}

Das Ergebnis ist eine Aufzählung von „address_component“ s, die mindestens ein „Typ“ Knoten haben, die den Wert Sie suchen nach hat enthält. Das Ergebnis der Abfrage über eine XElement, die folgenden Daten enthält.

<address_component>
  <long_name>California</long_name>
  <short_name>CA</short_name>
  <type>administrative_area_level_1</type>
  <type>political</type>
</address_component> 

Ich würde wirklich empfehlen in der Regel ein wenig Zeit für das Erlernen von LINQ zu verbringen, weil seine sehr nützlich für die Manipulation und Objekte im Speicher abfragt, Datenbanken abzufragen und neigt dazu, leichter zu sein als XPath verwenden, wenn die Arbeit mit XML. Meine Lieblingsseite zu Referenz http://www.hookedonlinq.com/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top