2011-02-11 40 views
5

tôi cần phải nhận được CountryName từ XML này: http://api.hostip.info/?ip=12.215.42.19Làm thế nào để có được một yếu tố có: trong tên của nó?

XML phản ứng là:

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

Vấn đề là tôi không thể bao gồm : trong phương pháp Descendants vì nó ném:

XmlException: Chaffater ':', giá trị thập lục phân 0x3A, không thể là được bao gồm trong một tên.

Cảm ơn

+0

theo cách tiêu đề và câu hỏi của bạn không khớp. bạn không thực sự cần phần tử với: trong tên. mà nghiêng câu trả lời của bạn đối với các giải pháp không gian tên –

Trả lời

5

thử

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

cập nhật này

mã hoàn chỉnh để tải về xml và tìm kiếm tên của 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

Tôi đã đưa ra một giải pháp lớn nhất, trong đó tôi đã tham khảo các không gian tên, nhưng của bạn là đơn giản hơn và không cần phải tham khảo các ns. Cảm ơn – emzero

+0

XDocument.Load() sẽ lấy URL, tải xuống và phân tích cú pháp lưu một vài dòng. –

+0

Rất vui được! –

1

Bạn cần phải tham khảo các namespace GML; một khi bạn đã làm điều đó bạn sẽ có thể để di chuyển bằng cách sử dụng tên thẻ xuất hiện ở bên phải của "GML:"

CẬP NHẬT

Tôi không chắc chắn những gì bối cảnh mà bạn đang áp dụng này để , nhưng đây là một giao diện điều khiển ứng dụng mẫu mà hoạt động:

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

Và làm thế nào để tôi tham khảo nó? – emzero

3

Một ví dụ nhỏ về cách áp dụng không gian tên trong LINQ to XML:

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

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

Tôi đã không thực sự cần phải đi qua các yếu tố "không gian tên" trong vấn đề của tôi. Nhưng 1 cho hồ sơ về làm thế nào để appy không gian tên trong 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; 

Hoặc bạn có thể đi sức mạnh vũ phu và dải tất cả các không gian tên:

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

Tôi đã làm điều này từ bộ nhớ, có thể có lỗi –

+0

Bạn nói đúng. Không có hàm tạo nào cho 'XNamespace'. Sử dụng 'XNamespace.Get()' hoặc truyền chuỗi thành một. ;) –

+0

cảm ơn ... tôi sẽ cập nhật –

Các vấn đề liên quan