簡體   English   中英

Web服務:無法將類型'System.Xml.Linq.XElement'隱式轉換為'System.Xml.XmlElement'

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM