2011-02-11 15 views
5

私はこのXMLからCOUNTRYNAMEを取得する必要があります: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:16進値0x3Aの の「:」チェッカーは、名前に を含めることはできません。

あなたはGMLの名前空間を参照する必要が感謝

+0

。あなたは実際には名前の中に:を付けて要素を必要としません。それは名前空間の解決策へのあなたの答えを歪曲しました –

答えて

5

この

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

アップデートを試してみてください

XMLをダウンロードして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

私は名前空間を参照しなければならない最大の解決策を考え出しましたが、あなたのものはより簡単であり、nsを参照する必要はありません。ありがとう – emzero

+0

XDocument.Load()はURLを受け取り、それをダウンロードし、数行を保存して解析します。 –

+0

それは助けてくれてうれしい! –

1

。私はあなたにこれを適用しているもの文脈わからない

UPDATE

:あなたは、「GML」の右側に表示されるタグ名を使用してナビゲートすることができなければならないことをやった後、が、ここでは作品のサンプルコンソールアプリケーションです:

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

XMLにLINQでの名前空間を適用する方法に小さな例:

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

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

私は本当に私の問題の "名前空間"の要素を横切る必要はありませんでした。しかし、LINQのXMLに名前空間を適用する方法の記録は+1です。 – 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

ありがとう...私は –

関連する問題