2016-04-29 80 views
0

我有一個沒有問題的web服務(asmx在iis中運行)。唯一的問題是客戶端對XML輸出非常嚴格。目前的格式如下:Xml從Webservice輸出添加一個Xml元素C#

<ArrayOfVenda xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://213.63.189.121/webservicenos"> 
<venda> 
<id>x</id> 
<contact_moment>x</contact_moment> 
</venda> 
<venda> 
<id>y</id> 
<contact_moment>y</contact_moment> 
</venda> 
</ArrayOfVenda> 

它應該是:

<ArrayOfVenda xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://213.63.189.121/webservicenos"> 
<root> 
<venda> 
<id>x</id> 
<contact_moment>x</contact_moment> 
</venda> 
<venda> 
<id>y</id> 
<contact_moment>y</contact_moment> 
</venda> 
</root> 
</ArrayOfVenda> 

所以,唯一的事情是添加有包含列表文達的名字根的XMLElement。我在添加這個元素時遇到了麻煩,我真的不知道如何在代碼中執行它。這裏是:

[WebMethod] 
[return: System.Xml.Serialization.XmlElementAttribute("venda")] 

    public List<venda> getListaVendas(string dt_min, string dt_max) 
    { 
    List<venda> objVendaList = new List<venda>(); 

     using (SqlConnection con = new SqlConnection(@"Data Source=server;Initial Catalog=db;User ID=user;password=password")) 
     { 
      using (SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.vcnosadesoes_getlistavendas where contact_moment >='" + dt_min + "' AND contact_moment <DATEADD(dd, 1, '" + dt_max + "')", con)) 
      { 
       con.Open(); 
       SqlDataReader dr = cmd.ExecuteReader(); 
       while (dr.Read()) 
       { 
        var objVenda = new venda(); 
        objVenda.id = dr["id"].ToString(); 
        objVenda.contact_moment = dr["contact_moment"].ToString(); 
        objVenda.nome = dr["nome"].ToString(); 
        objVenda.pacote = dr["pacote"].ToString(); 
        objVenda.telefone = dr["telefone"].ToString(); 
        objVenda.codigo_wc = dr["codigo_wc"].ToString();     
        objVendaList.Add(objVenda); 
       }     
       dr.Close(); 
      } 
     } 
     return objVendaList; 
    } 

任何想法什麼是最好的方法來添加此元素? PS:我知道。我必須更改SQL查詢,因爲SQL注入之前,我會達到它,讓它住不用擔心。此線:

[return: System.Xml.Serialization.XmlElementAttribute("venda")] 

可能無所事事,我只是把它放在一些測試,從來沒有評論出來。

更新:所以客戶端的腳本仍然返回錯誤。之後看調試小時,我發現了它需要的是這樣的輸出:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://213.63.189.121/webservicenos"> 
<venda> 
<id>x</id> 
<contact_moment>x</contact_moment> 
</venda> 
<venda> 
<id>y</id> 
<contact_moment>y</contact_moment> 
</venda> 
</root> 

回答

0

由於XML具有測試的額外水平(<ArrayOfVenda><venda>之間的<root>元素)返回C#的類型必須有一個類似的結構以該形式成功序列化。因此,引入新根型ArrayOfVenda

[XmlRoot(ElementName = "ArrayOfVenda", Namespace = "http://213.63.189.121/webservicenos")] 
public class ArrayOfVenda 
{ 
    [XmlArray("root")] 
    [XmlArrayItem("venda")] 
    public List<venda> VendaList { get; set; } 
} 

,並返回從getListaVendas方法:

public ArrayOfVenda getListaVendas(string dt_min, string dt_max) 
    { 
     List<venda> objVendaList = new List<venda>(); 

     // Fill in objVendaList as you do currently 

     return new ArrayOfVenda { VendaList = objVendaList }; 
    } 

更新

鑑於你的XML輸出的新的要求,你可以定義您的ArrayOfVenda類如下:

[XmlRoot(ElementName = "root", Namespace = "http://213.63.189.121/webservicenos")] 
public class ArrayOfVenda 
{ 
    [XmlElement("venda")] 
    public List<venda> VendaList { get; set; } 
} 

[XmlRoot(...)]定義ArrayOfVenda的名稱和名稱空間,它是根元素。 [XmlElement("venda")]指示VendaList將被格式化而沒有外部容器元素,並且每個項目將被命名爲<venda>

+0

非常感謝你,它完美的工作! –

+0

此外,如果我想添加到輸出頭: <?XML版本=「1.0」編碼=「UTF-8」?> 是否有任何方式補充的是? (這只是檢查不是一個大問題) –

+0

是的,我已經修好了。我注意到壽,它的返回我 。不需要,它使驗證失敗。我可以在xml輸出中抑制這個值嗎? –