2011-02-11 10 views
5

muszę uzyskać COUNTRYNAME z tego XML: http://api.hostip.info/?ip=12.215.42.19Jak zdobyć element, który ma: w swoim imieniu?

XML odpowiedź brzmi:

<HostipLookupResultSet version="1.0.1" 
    xmlns:gml="http://www.opengis.net/gml" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="http://www.hostip.info/api/hostip-1.0.1.xsd"> 

    <gml:description>This is the Hostip Lookup 
    Service</gml:description> 
    <gml:name>hostip</gml:name> 
    <gml:boundedBy> 
    <gml:Null>inapplicable</gml:Null> 
    </gml:boundedBy> 
    <gml:featureMember> 
    <Hostip> 
     <ip>12.215.42.19</ip> 
     <gml:name>Sugar Grove, IL</gml:name> 
     <countryName>UNITED STATES</countryName> 
     <countryAbbrev>US</countryAbbrev> 
     <!-- Co-ordinates are available as lng,lat --> 
     <ipLocation> 
     <gml:pointProperty> 
      <gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326"> 

      <gml:coordinates>-88.4588,41.7696</gml:coordinates> 
      </gml:Point> 
     </gml:pointProperty> 
     </ipLocation> 
    </Hostip> 
    </gml:featureMember> 
</HostipLookupResultSet> 

Problem jest, nie może zawierać : w metodzie Descendants ponieważ rzuca:

Wyjątek Xml: Nazwa ":" chracater, wartość szesnastkowa 0x3A, nie może być zawarta w nazwie.

Dzięki

+0

przy okazji, że Twój tytuł i pytanie nie pasują do siebie. tak naprawdę nie potrzebujesz elementu z: w nazwie. to przekrzywiło twoje odpowiedzi w kierunku rozwiązań przestrzeni nazw –

Odpowiedz

5

spróbować tej

var descendants = from i in XDocument.Load(xml).Descendants("Hostip") 
select i.Element("countryName"); 

Aktualizacja

kompletny kod do pobierania xml i znalezienie nazwę COUNTRYNAME

string xml; 
using(var web = new WebClient()) 
{ 
xml = web.DownloadString("http://api.hostip.info/?ip=12.215.42.19"); 
} 
var descendants = from i in XDocument.Parse(xml).Descendants("Hostip") 
select i.Element("countryName"); 
+0

Wpadłem na największe rozwiązanie, w którym musiałem odwoływać się do przestrzeni nazw, ale twoje jest prostsze i nie musi odwoływać się do ns. Dzięki – emzero

+0

XDocument.Load() pobierze adres URL, pobierze go i przeanalizuje, zapisując kilka linii. –

+0

Cieszę się, że pomogło! –

1

Trzeba odwołać się do nazw GML; raz zrobiłeś, że powinieneś być w stanie poruszać się za pomocą nazw znaczników, które pojawiają się po prawej stronie „GML:”

UPDATE

Nie jestem pewien, co kontekst starasz to , ale tutaj jest to aplikacja, która działa konsola próbka:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Linq; 

namespace LinqToXmlSample 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      XElement x = XElement.Load("http://api.hostip.info/?ip=12.215.42.19"); 
      foreach (XElement hostip in x.Descendants("Hostip")) 
      { 
       string country = Convert.ToString(hostip.Element("countryName").Value); 
       Console.WriteLine(country); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 
+0

A jak mam to odnieść? – emzero

3

Mały przykład, w jaki sposób zastosowanie nazw w LINQ do XML:

XElement doc = XElement.Load("test.xml"); 
XNamespace ns = "http://www.opengis.net/gml"; 

var firstName = doc.Descendants(ns + "name").First().Value; 
+0

Tak naprawdę nie musiałem przechodzić przez elementy "z nazwami" w moim problemie. Ale +1 dla zapisu, jak wstawić przestrzenie nazw w LINQ do XML =) – emzero

0
var gml = (XNamespace)"http://www.opengis.net/gml"; 
var doc = XDocument.Load(...) or XDocument.Parse(...); 
var name = doc.Descendants(gml + "featureMember").Descendants("countryName").First().Value; 

Albo mógłbyś idź brutalną siłą i usuń wszystkie przestrzenie nazw:

void RemoveNamespace(XDocument xdoc) 
{ 
    foreach (XElement e in xdoc.Root.DescendantsAndSelf()) 
    { 
     if (e.Name.Namespace != XNamespace.None) 
     { 
      e.Name = XNamespace.None.GetName(e.Name.LocalName); 
     } 

     if (e.Attributes().Any(a => a.IsNamespaceDeclaration || a.Name.Namespace != XNamespace.None)) 
     { 
      e.ReplaceAttributes(e.Attributes().Select(a => a.IsNamespaceDeclaration ? null : a.Name.Namespace != XNamespace.None ? new XAttribute(XNamespace.None.GetName(a.Name.LocalName), a.Value) : a)); 
     } 
    } 
} 
+0

Zrobiłem to z pamięci, mogą być błędy –

+0

Masz rację. Nie ma konstruktora dla 'XNamespace'. Użyj 'XNamespace.Get()' lub wyrzuć łańcuch do jednego. ;) –

+0

dzięki ... zaktualizuję –

Powiązane problemy