2014-04-11 102 views
0

我有一个场景,我创建了一个Web服务,它返回传递的用户名的名字和姓氏通过客户端(webservice消费者)。Webservices:不能隐式地将类型'System.Xml.Linq.XElement'转换为'System.Xml.XmlElement'

但即时得到在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是在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 [email protected]", 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; 



    } 

感谢

+0

很可能'GetUserDetails'返回'XElement',所以使用LINQ to XML代替。就个人而言,我更喜欢使用旧的DOM API :) –

+0

代理代码是什么样的?如果*客户端* GetUserDetails方法返回'XmlElement',那么你的原始编译错误是没有意义的。 –

+0

(另外,你应该在你的web方法中使用'using'语句...) –

回答

2

那么错误信息似乎相当清楚 - 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(); 
} 

你可能重构进一步提取“转换XElementDataSet”功能:

// 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”方法,它们将会类似地缩短。

+0

---我感谢你的时间......第一个解决方案在执行过程中返回了一个错误“CS0029:不能隐式地将类型'System.Xml.XmlElement'转换为'System.Xml.Linq.XElement'”,这是反向的我发布的问题。 第二个解决方案返回“CS1502:'_Default.ToDataSetOrNull(System.Xml.Linq.XElement)'的最佳重载方法匹配'有一些无效参数” – Itniv

+0

@Phanindra:它不喜欢执行错误 - 听起来像编译错误。但是错误没有任何意义 - 如果你将鼠标悬停在GetUserDetails上,它会显示什么样的返回类型? –

+0

抱歉,我的错误是它的编译错误。 我想只有我的网络方法有问题..我已经更新了我的问题。 – Itniv

相关问题