Autor Téma: XML z URL parsovani  (Přečteno 12548 krát)

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
XML z URL parsovani
« kdy: 07-07-2012, 01:53:09 »
O5 zdravim,

mam toto xml: http://maps.google.cz/maps/geo?q=Na%20Bezdekove+1738&gl=cs&hl=cs&output=xml

potrebuji z nej vytahnout pouze udaje jako coordinates a u AddressDetails posledni polozku "Accuracy=\"8\""
presneji, pokud je Accuracy rovno 8, tak abych to pokracovalo a vytahlo to ty coordinates.

zkousim to takto:
Kód: C++ [Vybrat]
  1. public string StahniXML(string sURL)
  2.         {
  3.             string sSouradnice = "";
  4.             XmlTextReader nactiXML = new XmlTextReader(sURL);
  5.             while (nactiXML.Read())
  6.             {
  7.                 // zjisteni presnosti, pokud je mensi nez 8, nebereme
  8.                 if (nactiXML.Name.EndsWith("Accuracy=\"8\""))
  9.                 {
  10.                     // az bude nazev coordinates, uloz jeho hodnetu do promenne
  11.                     if (nactiXML.Name == "coordinates")
  12.                     {
  13.                         sSouradnice = nactiXML.ReadString();
  14.                         break;
  15.                     }
  16.                 }
  17.                 else
  18.                 {
  19.                     continue;
  20.                 }
  21.             }
  22.             return sSouradnice;
  23.         }

bohuzel to nefunguje, tedy vim i proc, protoze toto: nactiXML.Name.EndsWith("Accuracy=\"8\"") vraci pouze tento retezec "AddressDetails"... Uz si tady s tim hraju asi hodinu... :(

Offline Mi.Chal.

  • Moderátoři
  • Guru
  • *****
  • Příspěvků: 577
  • Karma: 25
Re:XML z URL parsovani
« Odpověď #1 kdy: 07-07-2012, 09:37:51 »
měl bys zjišťovat, jakého typu je přečtený element a brát hodnoty z value, viz třeba http://msdn.microsoft.com/en-us/library/system.xml.xmltextreader.read.aspx.

Pokud těch dat není hodně, tak bych to proste načetl do XmlDocument a prolezl DOM, můžeš ty data vytáhnout i přes XPath a nemusíš ručně procházet všechno.

Offline TC

  • Příspěvků: 20
  • Karma: 1
Re:XML z URL parsovani
« Odpověď #2 kdy: 07-07-2012, 11:09:53 »
Kód: C++ [Vybrat]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Xml;
  5. using System.Net;
  6.  
  7. namespace Erdt
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             var sURL = "http://maps.google.cz/maps/geo?q=Na%20Bezdekove+1738&gl=cs&hl=cs&output=xml";
  14.  
  15.             var xml = new XmlTextReader(sURL);
  16.             int accuracy=0;
  17.             for (; xml.Read(); )
  18.             {
  19.                 if (xml.NodeType == XmlNodeType.Element && xml.Name == "AddressDetails")
  20.                 {
  21.                     var attr = xml.GetAttribute("Accuracy");
  22.                     if (attr != null) int.TryParse(attr, out accuracy);
  23.                 }
  24.                 if (xml.NodeType == XmlNodeType.Element && xml.Name == "LatLonBox" && accuracy==8)
  25.                 {
  26.                     var str=new string[]{"north","east","south","west"};
  27.                     foreach(var s in str)
  28.                     Console.WriteLine("{0} = {1}",s,xml.GetAttribute(s));
  29.                  }
  30.             }
  31.         }
  32.     }
  33. }
  34.  

Nyní jenom nezbývá než doufat, že slunéčko naše jasné, moderátor tohoto fóra,  nejvyšší osvícenost hlavní moderátor, a jeho všemocnost majitel fóra budou příznivě naloženi. Dojdou-li totiž k názoru, že publikovaná odpoveď je lepší než na jakou by se zmohlo slunéčko naše jasné moderátor tohoto fóra, nebo se nejvyšší osvícenost hlavní moderátor bude cítit ohrožen na mravnosti nestandardním slovem a nebo jeho všemocnost majitel fóra nebude spokojena s percepcí jeho fóra, tak ten příspěvek smažou.
Zdravim

TC
« Poslední změna: 09-07-2012, 08:46:21 od TC »

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Re:XML z URL parsovani
« Odpověď #3 kdy: 07-07-2012, 11:19:17 »
Děkuji pánové

Offline TC

  • Příspěvků: 20
  • Karma: 1
Re:XML z URL parsovani
« Odpověď #4 kdy: 08-07-2012, 10:27:14 »
A nebo jinak:

Kód: C++ [Vybrat]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Xml;
  5. using System.Net;
  6.  
  7. namespace Erdt
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             var sURL = "http://maps.google.cz/maps/geo?q=Na%20Bezdekove+1738&gl=cs&hl=cs&output=xml";
  14.  
  15.             var xml = new XmlDocument();
  16.             WebClient client = new WebClient();
  17.             byte[] b = client.DownloadData(sURL);
  18.             var str = new System.Text.UTF8Encoding().GetString(b);
  19.             xml.LoadXml(str);
  20.             var accuracy = xml.DocumentElement["Response"]["Placemark"]["AddressDetails"].Attributes["Accuracy"].Value;
  21.             var north = xml.DocumentElement["Response"]["Placemark"]["ExtendedData"]["LatLonBox"].Attributes["north"].Value;
  22.             Console.WriteLine("north = {0} with accuracy {1}", north, accuracy);
  23.         }
  24.     }
  25. }
  26.  

Zdravim

TC

« Poslední změna: 08-07-2012, 21:26:45 od Mi.Chal. »

Offline Mi.Chal.

  • Moderátoři
  • Guru
  • *****
  • Příspěvků: 577
  • Karma: 25
Re:XML z URL parsovani
« Odpověď #5 kdy: 08-07-2012, 11:49:51 »
// Ten Mi.Chal je sice blbej, ale je hodnej

TC, pro tvoji informaci - vlákno si původně zamkl jeho autor a pak ho odemkl. Takže ze sebe konečně přestaň dělat idiota a přestaň sem psát nesmysly na základě nějakých svých nepodložených domněnek.

Offline TC

  • Příspěvků: 20
  • Karma: 1
Re:XML z URL parsovani
« Odpověď #6 kdy: 08-07-2012, 12:21:00 »
A jeste trochu jinak
Kód: C++ [Vybrat]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Xml;
  5. using System.Net;
  6.  
  7. namespace Erdt
  8. {
  9.     /// <summary>
  10.     /// Aby se hnidopichove neposrali ze se nekontroluje platnost parametru
  11.     /// </summary>
  12.     class Program
  13.     {
  14.         static void Main(string[] args)
  15.         {
  16.             var sURL = "http://maps.google.cz/maps/geo?q=Na%20Bezdekove+1738&gl=cs&hl=cs&output=xml";
  17.  
  18.             var xml = new XmlDocument();
  19.             WebClient client = new WebClient();
  20.             byte[] b = client.DownloadData(sURL);
  21.             var str = new System.Text.UTF8Encoding().GetString(b);
  22.             xml.LoadXml(str);
  23.             var accuracy = Get(xml.DocumentElement, "Accuracy", "Response", "Placemark", "AddressDetails");
  24.             var north = Get(xml.DocumentElement, "north", "Response", "Placemark", "ExtendedData", "LatLonBox");
  25.             var fake = Get(xml.DocumentElement, "Response", "Error", "ExtendedData", "LatLonBox");
  26.             Console.WriteLine("north = {0} with accuracy {1}", north, accuracy);
  27.         }
  28.         static string Get(XmlElement elem, string attrib, params string[] key)
  29.         {
  30.             foreach (var k in key)
  31.             {
  32.                 elem = elem[k];
  33.                 if (elem == null) return "???";
  34.             }
  35.             var attr = elem.Attributes[attrib];
  36.             return attr == null ? "!!!" : attr.Value;
  37.         }
  38.     }
  39. }
  40.  
  41.  

Zdravim

TC
« Poslední změna: 08-07-2012, 18:44:04 od Mi.Chal. »

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Re:XML z URL parsovani
« Odpověď #7 kdy: 08-07-2012, 13:07:55 »
Prosim, nehadejte se... Je to moje chyba, ja to vlakno zamknul...

Ve skutečnosti jsem jen potřebaval k zadané adrese stáhnout GPS souřadnice, ale pouze pokud je přesnost rovna 8. Celé tamto řešení, bylo dobré, ale zbytečně stahovalo moc informací a já se v tom zamotával. www.maps.google.com poskytuje tyto 2 možnosti:

http://maps.google.com/maps/geo?q=Na%20Bezd%C4%9Bkov%C4%9B%201738,%20Bene%C5%A1ov&output=csv&key=         // zadost pouze o vyhodnoceni, prestnost, souradnice
http://maps.google.com/maps/geo?q=Na%20Bezd%C4%9Bkov%C4%9B%201738,%20Bene%C5%A1ov&gl=cs&hl=cs&output=xml  // zadost o veskereinformace

Nakonec jsem to vyresil takto:


Kód: C++ [Vybrat]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Net;
  10. using System;
  11.  
  12. namespace GeoCodePokus
  13. {
  14.     public partial class Form1 : Form
  15.     {
  16.         public Form1()
  17.         {
  18.             InitializeComponent();
  19.         }
  20.  
  21.         private void button1_Click(object sender, EventArgs e)
  22.         {
  23.             // Adresa
  24.             string strAddress = "Na Bezděkově 1738, Benešov";
  25.  
  26.             // Vytvořím cestu s adresou a API klíčem
  27.             string sPath = "http://maps.google.com/maps/geo?q=" + strAddress + "&output=csv&key=" + strKey;
  28.             textBox4.Text = sPath;
  29.  
  30.             // Použiji třídu WebClient na stažení CSV
  31.             // WebClietn je součástí třídy System.Net
  32.             WebClient client = new WebClient();
  33.  
  34.             // Stahuji CSV s šířkou a délkou
  35.             // .DownloadString metoda stahne CSV soubor z prohlížeče
  36.             string[] eResult = client.DownloadString(sPath).ToString().Split(',');
  37.  
  38.             // Jak vidíte, rozdělil jsme řetězec do pole
  39.  
  40.             // Vypsání výsledků do TextBoxů
  41.             textBox1.Text = eResult.GetValue(1).ToString(); // presnost
  42.             textBox2.Text = eResult.GetValue(2).ToString(); // souradniceA
  43.             textBox3.Text = eResult.GetValue(3).ToString(); // souradniceB  
  44.             textBox5.Text = eResult.GetValue(0).ToString(); // statusCode
  45.         }
  46.  
  47.         public string strKey { get; set; }
  48.     }
  49. }
  50.  

takže pokud někdo potřebuje stáhnout k zadané adrese GPS souřadnice, tak by mu měl stačit tento kód :) Máte k tomuto kódu nějaké připomínky?

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Re:XML z URL parsovani
« Odpověď #8 kdy: 08-07-2012, 18:51:21 »
Další dotaz,

zajímalo by mne, zda jde nějak rozšířit xml o další 2 údaje ke každému záznamu...

tedy dejme tomu, ze mam:

Kód: XML [Vybrat]
  1. - <Výpis>
  2.     - <Firma>
  3.         - <Nazev>
  4.         - <Telefon>
  5.         - <Ulice>
  6.         - <Mesto>
  7.         - <psc>
  8.     - </Firma>
  9.     - <Firma>
  10.         - <Nazev>
  11.         - <Telefon>
  12.         - <Ulice>
  13.         - <Mesto>
  14.         - <psc>
  15.     - </Firma>
  16. - </Výpis>
  17.  

a potreboval bych to tedy jeste rozsirit o sirku a delku, kterou zjistim diky tomu, ze si vytahnu ulici a mesto, prozenu to pres jiz vyreseny "program" a pak bych to rad ulozil.

Take nevim, jak to mam prochazet, aby to bralo firmu po firme...

z toho co psal TC jsem se naucil dotazovat na attributy:
Kód: C++ [Vybrat]
  1. var accuracy = xml.DocumentElement["Response"]["Placemark"]["AddressDetails"].Attributes["Accuracy"].Value;

zkoušel jsem se dotazovat na hodnotu Elementu, ktery nema attribut:
Kód: C++ [Vybrat]
  1. var accuracy = xml.DocumentElement["Výpis"]["Firma"]["Firma"]["Ulice"].Value;
  Ale toto nefunguje.

Snad jsem sem napsal vse potrebne...

Offline Mi.Chal.

  • Moderátoři
  • Guru
  • *****
  • Příspěvků: 577
  • Karma: 25
Re:XML z URL parsovani
« Odpověď #9 kdy: 08-07-2012, 19:14:01 »
zkoušel jsem se dotazovat na hodnotu Elementu, ktery nema attribut:
Kód: C++ [Vybrat]
  1. var accuracy = xml.DocumentElement["Výpis"]["Firma"]["Firma"]["Ulice"].Value;
  Ale toto nefunguje.

Snad jsem sem napsal vse potrebne...

Pokud node nemá atributy, tak Attributes[nazev] bude vracet null.

Pokud chceš procházet všechny firmy, tak procházej ChildNodes nodu Výpis

Offline Mi.Chal.

  • Moderátoři
  • Guru
  • *****
  • Příspěvků: 577
  • Karma: 25
Re:XML z URL parsovani
« Odpověď #10 kdy: 08-07-2012, 19:23:51 »
Pokud nectes text dotazu tak neodpovidej. Pro jistotu Ti sdelim, ze predmetny xml nebyl validni.

To předpokládám ví i tazatel a ptal se na něco jiného.