【问题标题】:Xml Output from Webservice Add a Xml Element C#来自 Web 服务的 Xml 输出添加一个 Xml 元素 C#
【发布时间】:2016-04-29 15:02:42
【问题描述】:

我有一个运行正常的 Web 服务(在 iis 中运行的 asmx)。唯一的问题是客户端对 XML 输出非常严格。当前格式如下:

<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>

所以唯一的事情就是添加一个名为 root 的 XMLElement,其中包含列表 venda。我在添加这个元素时遇到了麻烦,但我真的不知道如何在我的代码中处理它。这里是:

[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>

【问题讨论】:

    标签: c# xml web-services


    【解决方案1】:

    由于 XML 具有额外的测试级别(&lt;ArrayOfVenda&gt;&lt;venda&gt; 之间的 &lt;root&gt; 元素),因此您返回的 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 的名称和命名空间,当它是根 XML 元素时。 [XmlElement("venda")] 表示VendaList 将被格式化而没有外部容器元素,并且每个项目都将被命名为&lt;venda&gt;

    【讨论】:

    • 另外,如果我想在输出中添加标题: 有什么办法可以添加吗? (这没什么大不了的)
    • 是的,我已经修好了。我注意到它返回给我 . 是不需要的,它使验证失败。我可以在 xml 输出中抑制这个值吗?
    • @MiguelPecegueiro - &lt;ArrayofVenda&gt; 不是必需的,这会使验证失败。 当然这是可能的,但在您的问题中,您特别要求它存在。你在改变你的问题吗?
    • 嗯,是的,我猜。由于该元素,客户端提供给我们的脚本无法验证 xml 输出
    • 完成我更新了,所以我的问题的错误是我要求在原始代码中添加根元素,而需要的是用 root 重装 ArrayOfVenda。
    猜你喜欢
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多