[英]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.