![](/img/trans.png)
[英]VS2010 confuses System.Xml.XmlElement with System.Xml.Linq.XElement?
[英]Webservices : Cannot implicitly convert type 'System.Xml.Linq.XElement' to 'System.Xml.XmlElement'
我有一個創建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是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;
}
謝謝
好吧,錯誤消息似乎很清楚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”方法,它們的長度也會類似。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.