none
Resgatar valor de nó XML RRS feed

  • Pergunta

  • Oi Galera,
    Estou recebendo um XML no formato abaixo, como resgato somente o valor da linha <Placemark id="p1">
      <address>R. Padre Benedito de Camargo, 87-133 - Penha, São Paulo - SP, 03604-010, Brasil</address> e mostrar isso numa label.

    Valeu
    - <kml xmlns="http://earth.google.com/kml/2.0">
    - <Response>
      <name>-23.52562333333,-46.5525</name>
    - <Status>
      <code>200</code>
      <request>geocode</request>
      </Status>
    - <Placemark id="p1">
      <address>R. Padre Benedito de Camargo, 87-133 - Penha, São Paulo - SP, 03604-010, Brasil</address>
    - <AddressDetails Accuracy="8" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0">
    - <Country>
      <CountryNameCode>BR</CountryNameCode>
      <CountryName>Brasil</CountryName>
    - <AdministrativeArea>
      <AdministrativeAreaName>SP</AdministrativeAreaName>
    - <Locality>
      <LocalityName>São Paulo</LocalityName>
    - <Thoroughfare>
      <ThoroughfareName>R. Padre Benedito de Camargo, 87-133</ThoroughfareName>
      </Thoroughfare>
    - <PostalCode>
      <PostalCodeNumber>03604-010</PostalCodeNumber>
      </PostalCode>
      </Locality>
      </AdministrativeArea>
      </Country>
      </AddressDetails>
    - <ExtendedData>
      <LatLonBox north="-23.5225176" south="-23.5288128" east="-46.5493042" west="-46.5555994" />
      </ExtendedData>
    - <Point>
      <coordinates>-46.5524669,-23.5256521,0</coordinates>
      </Point>
      </Placemark>
    - <Placemark id="p2">
      <address>Penha, São Paulo - SP, 03604-030, Brasil</address>
    - <AddressDetails Accuracy="5" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0">
    - <Country>
      <CountryNameCode>BR</CountryNameCode>
      <CountryName>Brasil</CountryName>
    - <PostalCode>
      <PostalCodeNumber>03604-030</PostalCodeNumber>
      </PostalCode>
      </Country>
      </AddressDetails>
    - <ExtendedData>
      <LatLonBox north="-23.5231639" south="-23.5294591" east="-46.5486268" west="-46.5549221" />
      </ExtendedData>
    - <Point>
      <coordinates>-46.5517745,-23.5263115,0</coordinates>
      </Point>
      </Placemark>
      </Response>
      </kml>




     <?xml version="1.0" encoding="UTF-8" ?>
    terça-feira, 18 de agosto de 2009 14:39

Respostas

  • é uma utilização de XPath que é realizada.

            private string ObterEndereco(int id, string strXml)
            {
                System.Xml.XmlDocument xmlDom = new System.Xml.XmlDocument();
    
                // Lendo os dados do XML passados como parametro.
                xmlDom.LoadXml(strXml);
    
    // Remove uma informação não útil neste momento // e que atrapalham a fazer o XPath xmlDom.InnerXml = xmlDom.InnerXml.Replace(@"<kml xmlns=""http://earth.google.com/kml/2.0"">", "<kml>"); // Realizando uma "pesquisa" pelo "Placemark" desejado // Será recuperado qualquer Placemark no XML que contenha // o ID igual a "p?", onde o "?" é um ID indicado como parametro. // Assim que for encontrado o Placemark desejado, será recuperado o "address" que estiver dentro // do Placemark com o ID indicado. System.Xml.XmlNode node = xmlDom.SelectSingleNode("//Placemark[@id='p" + id.ToString() + "']/address"); // Apenas verificando se achou para recuperar a informação, // caso esteja disponível string retorno = string.Empty; if (node != null) { retorno = node.InnerText; } return retorno; }

    Se vc fizer a chamada do método passando como parametro o número 1 e o XML que vc já conseguiu recuperar, ele irá retornar o dado desejado.

    Qualquer duvida, posta aqui para que possamos te ajudar.
    Rafael F. P.
    MTS em Aplicações WEB c/ .NET 2.0

    Se a resposta de alguém foi útil, marque a resposta como tal.
    Se alguém conseguiu te ajudar, poderia marcar como "Respondido" ?
    Obs: Resposta útil é diferente de resposta final.

    Grato. :)
    • Sugerido como Resposta Rafael F P terça-feira, 18 de agosto de 2009 18:15
    • Marcado como Resposta Fernando Oliveira terça-feira, 18 de agosto de 2009 18:46
    terça-feira, 18 de agosto de 2009 18:13

Todas as Respostas

  • Olá Fernando,  dot.net disponibiliza todas as funcionalidades necessarias para leitura e escrita de um xml. Basta você importar a classe System.Xml.

    Exemplo:

    using System.Xml;

    ...

    XmlDocument xmlDoc = new XmlDocument();

    FAZ A LEITURA DE UM XML
    xmlDoc.LoadXml("CAMINHO DO XML");

    RETORNA UM NO ESPECIFICO DE ACORDO COM O NOME
    xmlDoc.SelectSingleNode("NOME DO NODE");

    Att,
    Israel Gonçalves “Caso esta resposta tenha ajudado a solucionar sua dúvida, favor clicar em “Marcar como Resposta” para beneficiar outros membros da comunidade que estejam lendo este thread”.
    terça-feira, 18 de agosto de 2009 15:13
  • É como o Israel falou. Existem classes nativas para trabalhar com XML.

    Segue exemplo
            private string ObterEndereco(int id)
            {
                System.Xml.XmlDocument xmlDom = new System.Xml.XmlDocument();
                xmlDom.Load(this.Page.Server.MapPath("~/XmlXPath.xml"));
                xmlDom.InnerXml = xmlDom.InnerXml.Replace(@"<kml xmlns=""http://earth.google.com/kml/2.0"">", "<kml>");
                
                System.Xml.XmlNode node = xmlDom.SelectSingleNode("//Placemark[@id='p" + id.ToString() + "']/address");
    
                string retorno = string.Empty;
                if (node != null)
                {
                    retorno = node.InnerText;
                }
    
                return retorno;
            }
    

    E para recuperar o endereço desejado ( segudo exemplo pedido )
    this.lblEndereco.Text = this.ObterEndereco(1);


    Qualquer duvida, posta aqui para que possamos te ajudar.
    Rafael F. P.
    MTS em Aplicações WEB c/ .NET 2.0

    Se a resposta de alguém foi útil, marque a resposta como tal.
    Se alguém conseguiu te ajudar, poderia marcar como "Respondido" ?
    Obs: Resposta útil é diferente de resposta final.

    Grato. :)
    • Sugerido como Resposta Rafael F P terça-feira, 18 de agosto de 2009 17:22
    terça-feira, 18 de agosto de 2009 15:28
  • Oi Rafael, fiz assim:

    Dim

     

    Url As String = "http://maps.google.com/maps/geo?q=" & lat & "," & longit & "&output=xml&sensor=true_or_false&key=" & chave & ""

     

    Dim xmlDom As New System.Xml.XmlDocument()

    xmlDom.Load(Url)

    Mas dá esse erro no retorno do XML

    Caractere inválido na codificação fornecida. Linha 9, posição 61.

    terça-feira, 18 de agosto de 2009 15:43
  • Fernando,

    Se não me engano, o "XmlDocument.Load()" não aceita URLs.
    Para fazer do jeito que você está querendo, vc teria que ter um arquivo ( ou em memoria ) do XML e depois utilizar o método "LoadXml()".

    O "LoadXml()" permite você colocar uma string que represente o seu XML.



    Qualquer duvida, posta aqui para que possamos te ajudar.
    Rafael F. P.
    MTS em Aplicações WEB c/ .NET 2.0

    Se a resposta de alguém foi útil, marque a resposta como tal.
    Se alguém conseguiu te ajudar, poderia marcar como "Respondido" ?
    Obs: Resposta útil é diferente de resposta final.

    Grato. :)
    terça-feira, 18 de agosto de 2009 15:55
  • Oi Rafael, fiz como abaixo e dá o mesmo erro:

    Dim

     

    Url As String = "http://maps.google.com/maps/geo?q=" & lat & "," & longit & "&output=xml&sensor=true_or_false&key=" & chave & ""

     

    Dim endereco As String

     

    Dim req As HttpWebRequest

     

    Dim res As HttpWebResponse

     

    Dim xmlDOC As New XmlDocument

     

    Dim loNode As XmlNode

    req =

    CType(WebRequest.Create(Url), HttpWebRequest)

    res =

    CType(req.GetResponse, HttpWebResponse)

    xmlDOC.Load(res.GetResponseStream)

    loNode = xmlDOC.SelectSingleNode(

    "//Placemark[@id='p1']/address")

    endereco = loNode.FirstChild.Value

     

    Return endereco

    terça-feira, 18 de agosto de 2009 15:58
  • Fernado vc ja tentou acessar a url que retorna no seu metodo diretamente no brownser ? retorna o XML ?


    Att,
    Israel Gonçalves “Caso esta resposta tenha ajudado a solucionar sua dúvida, favor clicar em “Marcar como Resposta” para beneficiar outros membros da comunidade que estejam lendo este thread”.
    terça-feira, 18 de agosto de 2009 16:01
  • Fernando tente fazer assim:

                //lendo arquivo
                XmlTextReader reader = new XmlTextReader(strPathXml);

                //retirando nós contendo apenas espaços em branco
                reader.WhitespaceHandling = WhitespaceHandling.None;

                //lendo o xml
                XmlDocument xmlDoc = new XmlDocument();
                string xml = reader.ToString();
                xmlDoc.Load(reader);


    Att,
    Israel Gonçalves “Caso esta resposta tenha ajudado a solucionar sua dúvida, favor clicar em “Marcar como Resposta” para beneficiar outros membros da comunidade que estejam lendo este thread”.
    terça-feira, 18 de agosto de 2009 16:14
  • Oi Israel, mesmo erro qdo chega aqui xmlDoc.Load(reader)

    Caractere inválido na codificação fornecida. Linha 9, posição 61.
    terça-feira, 18 de agosto de 2009 16:19
  • Fernando,

    Você tentou alterar as configurações da aplicação para trabalherem com o UTF-8 ?
    Eu estou achando que, ao recuperar os dados da WEB os caracteres acentuados estão sendo trocados por causa do Encoding.

    Tenta alterar no CONFIG ( WEB ou APP ) da aplicação e testa novamente



    Qualquer duvida, posta aqui para que possamos te ajudar.
    Rafael F. P.
    MTS em Aplicações WEB c/ .NET 2.0

    Se a resposta de alguém foi útil, marque a resposta como tal.
    Se alguém conseguiu te ajudar, poderia marcar como "Respondido" ?
    Obs: Resposta útil é diferente de resposta final.

    Grato. :)
    terça-feira, 18 de agosto de 2009 16:25
  • Oi Rafael, no meu web.config já está como utf-8,

    <

     

    globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="pt-BR"/>

    Eu resgatei o retorno do Google numa string de texto, aí eu tenho todo o conteúdo do XML convertido em string de texto.

    Como faço para extrair só o que está dentro dessa parte da sring <address>R. Padre Benedito de Camargo, 87-133 - Penha, São Paulo - SP, 03604-010, Brasil</address>, só o que está dentro de <address>?

    Ou seja, quero percorrer a string e qdo encontrar o primeiro <address> da string, resgato o conteudo dessa string até </address>, o que vier depois não me interessa mais.

    Valeu.

    terça-feira, 18 de agosto de 2009 16:36
  • Legal.
    Agora da uma olhada no meu primeiro post que fala sobre a utilização de "XPath".



    Qualquer duvida, posta aqui para que possamos te ajudar.
    Rafael F. P.
    MTS em Aplicações WEB c/ .NET 2.0

    Se a resposta de alguém foi útil, marque a resposta como tal.
    Se alguém conseguiu te ajudar, poderia marcar como "Respondido" ?
    Obs: Resposta útil é diferente de resposta final.

    Grato. :)
    terça-feira, 18 de agosto de 2009 16:41
  • Oi Rafael, até li mas realmente não entendo nada de XML, se puder me dar um exemplo prático.

    Valeu
    terça-feira, 18 de agosto de 2009 18:05
  • é uma utilização de XPath que é realizada.

            private string ObterEndereco(int id, string strXml)
            {
                System.Xml.XmlDocument xmlDom = new System.Xml.XmlDocument();
    
                // Lendo os dados do XML passados como parametro.
                xmlDom.LoadXml(strXml);
    
    // Remove uma informação não útil neste momento // e que atrapalham a fazer o XPath xmlDom.InnerXml = xmlDom.InnerXml.Replace(@"<kml xmlns=""http://earth.google.com/kml/2.0"">", "<kml>"); // Realizando uma "pesquisa" pelo "Placemark" desejado // Será recuperado qualquer Placemark no XML que contenha // o ID igual a "p?", onde o "?" é um ID indicado como parametro. // Assim que for encontrado o Placemark desejado, será recuperado o "address" que estiver dentro // do Placemark com o ID indicado. System.Xml.XmlNode node = xmlDom.SelectSingleNode("//Placemark[@id='p" + id.ToString() + "']/address"); // Apenas verificando se achou para recuperar a informação, // caso esteja disponível string retorno = string.Empty; if (node != null) { retorno = node.InnerText; } return retorno; }

    Se vc fizer a chamada do método passando como parametro o número 1 e o XML que vc já conseguiu recuperar, ele irá retornar o dado desejado.

    Qualquer duvida, posta aqui para que possamos te ajudar.
    Rafael F. P.
    MTS em Aplicações WEB c/ .NET 2.0

    Se a resposta de alguém foi útil, marque a resposta como tal.
    Se alguém conseguiu te ajudar, poderia marcar como "Respondido" ?
    Obs: Resposta útil é diferente de resposta final.

    Grato. :)
    • Sugerido como Resposta Rafael F P terça-feira, 18 de agosto de 2009 18:15
    • Marcado como Resposta Fernando Oliveira terça-feira, 18 de agosto de 2009 18:46
    terça-feira, 18 de agosto de 2009 18:13
  • Oi Rafael, valeu mesmo.
    Agora tudo se iluminou. rsrsrs

    Abç.
    terça-feira, 18 de agosto de 2009 18:47
  • posta a sulução no final.


    Só Deus Salva O resto Faz BACKUP
    terça-feira, 18 de agosto de 2009 20:16
  • Oi Apostolo, a função final ficou como abaixo. Os parâmetros passados são as coordenadas latitude e longitude e uma chave que o Google envia qdo a gente cadastra nosso site pra usar o GoogleMaps.

    Public

     

    Function resgataReferenciaXMLGoogle(ByVal lat As String, ByVal longit As String, ByVal chave As String)

     

    Try

     

    Dim Url As String = "http://maps.google.com/maps/geo?q=" & lat & "," & longit & "&output=xml&sensor=true_or_false&key=" & chave & ""

     

    Dim strXML As String

     

    Dim endereco As String = ""

     

    Dim req As HttpWebRequest = DirectCast(WebRequest.Create(Url), HttpWebRequest)

     

    Dim res As HttpWebResponse = DirectCast(req.GetResponse(), HttpWebResponse)

     

    Dim ResponseStream As New StreamReader(res.GetResponseStream(), System.Text.Encoding.GetEncoding("ISO-8859-1"))

    strXML = ResponseStream.ReadToEnd()

    res.Close()

    ResponseStream.Close()

     

    Dim xmlDom As New System.Xml.XmlDocument()

     

    xmlDom.LoadXml(strXML)

     

    xmlDom.InnerXml = xmlDom.InnerXml.Replace("<kml xmlns=""http://earth.google.com/kml/2.0"">", "<kml>")

     

    Dim node As System.Xml.XmlNode = xmlDom.SelectSingleNode("//Placemark[@id='p1']/address")

     

    If node IsNot Nothing Then

    endereco = node.InnerText

     

    End If

     

    Return endereco

     

    Catch ex As Exception

     

    Throw New Exception(ex.Message)

     

    End Try

     

    End Function

    terça-feira, 18 de agosto de 2009 20:24