【问题标题】:Webservices : Cannot implicitly convert type 'System.Xml.Linq.XElement' to 'System.Xml.XmlElement'Webservices:无法将类型“System.Xml.Linq.XElement”隐式转换为“System.Xml.XmlElement”
【发布时间】:2014-04-11 12:49:56
【问题描述】:

我有一个场景,我创建了一个 Web 服务,它返回通过客户端(Web 服务使用者)传递的用户名的名字和姓氏。

但我在第 5 行出现错误:无法将类型“System.Xml.Linq.XElement”隐式转换为“System.Xml.XmlElement”

以下是用于检索数据的代码

protected void BindUserDetails(string userName)
    {
        UserService.ServiceSoapClient client = new UserService.ServiceSoapClient();
        DataSet dsresult = new DataSet();
       XmlElement exelement = client.GetUserDetails(userName);
        if (exelement != null)
        {
            XmlNodeReader nodereader = new XmlNodeReader(exelement);
            dsresult.ReadXml(nodereader, XmlReadMode.Auto);
            gvUserDetails.DataSource = dsresult;
            gvUserDetails.DataBind();
        }
        else
        {
            gvUserDetails.DataSource = null;
            gvUserDetails.DataBind();
        }
    }

UserService 是我添加的服务参考。 gvUserDetails 是网格视图

[WebMethod]
    public XmlElement GetUserDetails(string username) {

        SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["TestingCS"].ConnectionString);
        cn.Open();
        SqlCommand cmd = new SqlCommand("select * from userInfo where username=@username", cn);
        cmd.Parameters.AddWithValue("@username", username);
        cmd.ExecuteNonQuery();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);
        cn.Close();
        XmlDataDocument xmldata = new XmlDataDocument(ds);
        XmlElement xmlElement = xmldata.DocumentElement;
        return xmlElement;



    } 

谢谢

【问题讨论】:

  • 嗯,大概GetUserDetails 返回一个XElement,所以请改用LINQ to XML。就个人而言,我更喜欢使用旧的 DOM API :)
  • 代理代码是什么样的?如果client-sideGetUserDetails方法返回XmlElement,那么你原来的编译错误就没有意义了。
  • (另外,您应该在您的网络方法中使用using 语句...)
  • 这是我使用的唯一代码.. 我的 prog 中没有任何额外的代码
  • 好吧,您已经为服务生成了代理代码。这就是为什么我问如果您将鼠标悬停在客户端代码中的方法名称上会显示什么返回类型。 会显示什么

标签: c# asp.net web-services asmx


【解决方案1】:

嗯,错误消息似乎相当清楚 - GetUserDetails 正在返回 XElement(从 LINQ 到 XML)而不是 XmlDocument(从旧 API)。

这应该不是问题,因为基本上您只需要选择一个元素并从中创建一个XmlReader。看起来您的代码可以更改为:

protected void BindUserDetails(string userName)
{
    UserService.ServiceSoapClient client = new UserService.ServiceSoapClient();
    XElement element = client.GetUserDetails(userName);
    if (element != null)
    {
        DataSet dsresult = new DataSet();
        XmlReader reader = element.CreateReader();
        dsresult.ReadXml(reader, XmlReadMode.Auto);
        gvUserDetails.DataSource = dsresult;
    }
    else
    {
        gvUserDetails.DataSource = null;
    }
    gvUserDetails.DataBind();
}

您可以进一步重构它以提取“将XElement 转换为DataSet”功能:

// You could *consider* making this an extension method
public static DataSet ToDataSetOrNull(XElement source)
{
    if (source == null)
    {
        return null;
    }
    DataSet result = new DataSet();
    result.ReadXml(source.CreateReader(), XmlReadMode.Auto);
    return result;
}

那么你的BindUserDetails 代码就是:

protected void BindUserDetails(string userName)
{
    UserService.ServiceSoapClient client = new UserService.ServiceSoapClient();
    gvUserDetails.DataSource = ToDataSetOrNull(client.GetUserDetails(userName));
    gvUserDetails.DataBind();
}

...如果您有其他“BindXyzDetails”方法,它们也会同样简短。

【讨论】:

  • ---我感谢您的宝贵时间...第一个解决方案在执行期间返回错误“ CS0029:无法将类型'System.Xml.XmlElement'隐式转换为'System.Xml.Linq .XElement'" 这与我发布的问题相反。第二种解决方案返回“CS1502:'_Default.ToDataSetOrNull(System.Xml.Linq.XElement)' 的最佳重载方法匹配有一些无效参数”
  • @Phanindra:这不像是执行错误——听起来像是编译错误。但错误没有意义 - 如果您将鼠标悬停在 GetUserDetails 上,它会显示什么返回类型?
  • 抱歉我的错误是编译错误。我想只有我的网络方法有问题..我也更新了我的问题..
  • @Phanindra:现在你已经添加了方法,你原来的编译错误没有意义:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
相关资源
最近更新 更多