Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中使用linq to xml从xml访问子元素时返回null#_C# - Fatal编程技术网

C# 在c中使用linq to xml从xml访问子元素时返回null#

C# 在c中使用linq to xml从xml访问子元素时返回null#,c#,C#,请大家帮助我,我需要使用一个从我的应用程序返回xml的web服务,下载xml的代码工作正常,但我需要从xml文件中提取值,但我一直从代码中获取null返回值,确切地说GetLocationFromXml()方法就是返回null的方法,GetLocationAsXMLFromHost()这个方法很好用 这是完整的课程 using System; using System.Collections.Generic; using System.Linq; using System.Text; using

请大家帮助我,我需要使用一个从我的应用程序返回xml的web服务,下载xml的代码工作正常,但我需要从xml文件中提取值,但我一直从代码中获取null返回值,确切地说GetLocationFromXml()方法就是返回null的方法,GetLocationAsXMLFromHost()这个方法很好用

这是完整的课程

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AMIS.Core.DTOs;
using System.Net;
using System.Xml.Linq;
using System.Xml;
using System.Linq;

public class GeoLocationService
{
   private string _hostWebSite = "http://api.hostip.info";
    private readonly XNamespace _hostNameSpace = "http://www.hostip.info/api";
    private readonly XNamespace _hostGmlNameSpace = "http://www.opengis.net/gml";

public LocationInfo GetLocationInfoFromIPAddress(string userHostIpAddress)
{
    IPAddress ipAddress = null;
    IPAddress.TryParse(userHostIpAddress, out ipAddress);
    string xmlData = GetLocationAsXMLFromHost(ipAddress.ToString());
    LocationInfo locationInfo = GetLocationFromXml(xmlData);
    return locationInfo;
}

private string GetLocationAsXMLFromHost(string userHostIpAddress)
{
    WebClient webClient= new WebClient();
    string formattedUrl = string.Format(_hostWebSite + "/?ip={0}", userHostIpAddress);
    var xmlData = webClient.DownloadString(formattedUrl);
    return xmlData;
}

private LocationInfo GetLocationFromXml(string xmlData)
{
    LocationInfo locationInfo = new LocationInfo();
    var xmlResponse = XDocument.Parse(xmlData);
    var nameSpace = (XNamespace)_hostNameSpace;
    var gmlNameSpace = (XNamespace)_hostGmlNameSpace;

    try
    {
        locationInfo = (from x in xmlResponse.Descendants(nameSpace + "Hostip")
                        select new LocationInfo
                        {
                            CountryName = x.Element(nameSpace + "countryName").Value,
                            CountryAbbreviation = x.Element(nameSpace + "countryAbbrev").Value,
                            LocationInCountry = x.Element(gmlNameSpace + "name").Value
                        }).SingleOrDefault();
    }
    catch (Exception)
    {
        throw;
    }
    return locationInfo;
}
}
下面是xml文件

<?xml version="1.0" encoding="iso-8859-1"?>
<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>41.78.8.3</ip>
  <gml:name>(Unknown city)</gml:name>
  <countryName>NIGERIA</countryName>
  <countryAbbrev>NG</countryAbbrev>
  <!-- Co-ordinates are unavailable -->
  </Hostip>
</gml:featureMember>
</HostipLookupResultSet>

这是Hostip查找服务
霍斯蒂普
不适用
41.78.8.3
(未知城市)
尼日利亚
NG

鉴于这些评论,我怀疑问题可能很简单:

private string _hostNameSpace = "hostip.info/api";
应该是:

private string _hostNameSpace = "http://hostip.info/api";
(其他人也一样。)就我个人而言,我首先要创建XNamespace值:

private static readonly XNamespace HostNameSpace = "http://hostip.info/api";

编辑:好的,在搞乱了您的示例(可能要短得多、完整得多)之后,我已经找出了错误:您正在使用“主机名称空间”查找元素,但XML中的元素不在任何名称空间中。只要去掉那些名称空间位,它就可以正常工作。

什么是
\u hostNameSpace
?如果你能发布一个简短但完整的程序,那会有所帮助。对不起,我省略了它私人字符串“_hostWebSite=”“;私有字符串_hostNameSpace=“”;私有字符串_hostGmlNameSpace=“”;请编辑您的帖子,而不是将其放在评论中,最好是使其成为我们可以运行的完整控制台应用程序。@Adewole:Edited。基本上从代码中删除
\u hostNameSpace+
位。。。您正在命名空间中查找元素,但它们不在该命名空间中。。。