简体   繁体   English

Web服务:无法将类型'System.Xml.Linq.XElement'隐式转换为'System.Xml.XmlElement'

[英]Webservices : Cannot implicitly convert type 'System.Xml.Linq.XElement' to 'System.Xml.XmlElement'

I have a scenario where i have created a web service, which returns the first name and last name of the username passed through client(webservice consumer). 我有一个创建Web服务的方案,该服务返回通过客户端(Web服务使用者)传递的用户名的名字和姓氏。

but im getting an error in 5th line :Cannot implicitly convert type 'System.Xml.Linq.XElement' to 'System.Xml.XmlElement' 但我在第5行出现错误:无法将类型'System.Xml.Linq.XElement'隐式转换为'System.Xml.XmlElement'

Below is the code using to retrieve data 以下是用于检索数据的代码

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 is the Service reference which i have added. UserService是我添加的服务参考。 gvUserDetails is the gridview gvUserDetails是gridview

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



    } 

thanks 谢谢

Well the error message seems reasonably clear - GetUserDetails is returning XElement (from LINQ to XML) rather than XmlDocument (from the older API). 好吧,错误消息似乎很清楚GetUserDetails返回XElement (从LINQ到XML)而不是XmlDocument (从较旧的API)。

This shouldn't be a problem though, as basically you just need to select an element and create an XmlReader from it. 不过,这应该不成问题,因为基本上您只需要选择一个元素并从中创建一个XmlReader It looks like your code can just be changed to: 看来您的代码可以更改为:

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();
}

You could potentially refactor that further to extract the "convert XElement to DataSet " functionality: 您可能会进一步重构它,以提取“将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;
}

Then your BindUserDetails code is just: 然后,您的BindUserDetails代码就是:

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

... and if you have other "BindXyzDetails" methods, they'll be similarly short. ...,如果您还有其他“ BindXyzDetails”方法,它们的长度也会类似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 VS2010将System.Xml.XmlElement与System.Xml.Linq.XElement混淆? - VS2010 confuses System.Xml.XmlElement with System.Xml.Linq.XElement? Linq - 无法隐式转换类型&#39;System.Collections.Generic.IEnumerable <System.Xml.Linq.XElement> &#39;to&#39;System.Collections.Generic.List <string> “ - Linq - Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>' to 'System.Collections.Generic.List<string>' System.Xml.Linq.XElement中的查询元素 - Query elements in System.Xml.Linq.XElement 无法将类型&#39;System.Xml.Linq.XElement的表达式强制转换为XXX类型 - cannot cast expression of type 'System.Xml.Linq.XElement to type XXX Linq强制转换Xelement错误:无法将类型为'System.Xml.Linq.XElement'的对象强制转换为'System.IConvertible' - Linq cast conversion Xelement error: Unable to cast object of type 'System.Xml.Linq.XElement' to type 'System.IConvertible' System.Xml.Linq.XElement&#39;不包含&#39;XPathEvaluate的定义 - System.Xml.Linq.XElement' does not contain a definition for 'XPathEvaluate 扩展System.Xml.Linq.XElement-内部CloneNode - Extending System.Xml.Linq.XElement - internal CloneNode 如何使用XmlWriter将System.Xml.Linq.XElement写入流 - How to write System.Xml.Linq.XElement using XmlWriter to a stream 如何反序列化 System.Xml.Linq.XElement? - How I can deserialize a System.Xml.Linq.XElement? IXmlSerializable类型&#39;System.Xml.Linq.XElement&#39;必须具有默认构造函数 - IXmlSerializable Type 'System.Xml.Linq.XElement' must have default constructor
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM