2011-02-11 188 views
5

我需要從這個XML的國家或地區名稱:http://api.hostip.info/?ip=12.215.42.19如何獲取具有以下名稱的元素:名稱中?

響應XML是:

<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> 

問題是我不能包括:Descendants方法,因爲它會拋出:

XmlException:':'chracater, 十六進制值0x3A,不能是 包含在名稱中。

感謝

+0

順便說一下你的標題和問題不匹配。你實際上並不需要名稱中的元素:歪曲你對命名空間解決方案的回答 –

回答

5

試試這個

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

更新

下載XML並找到國家名稱

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

我想出了一個最大的解決方案,我不得不引用命名空間,但是你更簡單,不需要引用ns。謝謝 – emzero

+0

XDocument.Load()將獲取一個URL,下載它並解析它,保存幾行文字。 –

+0

很高興幫助! –

1

您需要引用GML命名空間;一旦你這樣做,你應該能夠使用該出現的正確的標籤名稱導航「GML:」

UPDATE

我不知道你申請這什麼情況,但這裏有一個樣本控制檯應用程序的作品:

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

我該如何引用它? – emzero

3

如何在LINQ應用命名空間XML的一個小例子名稱完整代碼:

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

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

我真的不需要遍歷我的問題中的「名稱空間」元素。但+1如何應用LINQ to 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; 

或者你可以去蠻力和去除所有命名空間:

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

我是從內存中完成這項工作的,可能有錯誤 –

+0

您是對的。沒有'XNamespace'的構造函數。使用'XNamespace.Get()'或將字符串轉換爲一個。 ;) –

+0

謝謝...我會更新 –