XML字符串数组反序列化问题

时间:2016-12-14 13:48:04

标签: c# asp.net xml asp.net-web-api

我正在使用Visual Studio 2013.我创建了一个ASP.Net Web API项目,并添加了一个控制器,模型和其他相关类。请在下面找到我的课程详情

产品类

public partial class Products{

   [XmlArray("Product")]      // Tried this also XmlArray(ElementName = "Product")
   [XmlArrayItem("productName")]
   public List<string> productName { get; set; }
}

在其他课程中,我正在初始化Products类对象,如下所述

public Products Get()
{
    Products objProducts = new Products
    {
       productName = new List<string>
       {
                    "P1",
                    "P2",
                    "P3"
        };     
    };
    return objProducts;
}

每当我在浏览器上执行url (http://localhost/service/api/Products)时,我就得到了XML

<Products>
    <Product>
        <string>P1</string>
        <string>P2</string>
        <string>P3</string>
    </Product>
</Products>

如果我能得到这个,我应该喜欢它:

<Products>
    <Product>
        <productName>P1</productName>
        <productName>P2</productName>                       
        <productName>P3</productName>
    </Product>
<Products>

2 个答案:

答案 0 :(得分:1)

问题在于两个嵌套标签 - POC中没有任何类似于该层次结构的内容。如果你重新组织你的POC课程,你可以逃脱。

web api序列化输出到xml的方式有两种。请参阅https://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization以供参考。

一个使用DataContractSerializer(默认),另一个使用XmlSerializer

// configure web api to use XmlSerializer
var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter;
xml.UseXmlSerializer = true;

现在,如果你正在使用XmlSerializer

public class Products
{
    [XmlElement("Product")]
    public ProductNameList Product { get; set; }
}

public class ProductNameList
{
    [XmlElement("productName")]
    public List<string> ProductName { get; set; }
}

用法:

var serializer = new XmlSerializer(typeof(Products));
var stream = new MemoryStream();
serializer.Serialize(stream, new Products
{
  Product = new ProductNameList { ProductName = new List<string> { "aa", "bb" } }
});
var result = Encoding.ASCII.GetString(stream.ToArray());

转储:

<?xml version="1.0"?>
<Products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Product>
    <productName>aa</productName>
    <productName>bb</productName>
  </Product>
</Products>

如果您正在使用DataContractSerializer

public class Products
{
    public ProductNameList Product { get; set; }
}

[CollectionDataContract(ItemName = "productName")]
public class ProductNameList : List<string>
{
}    

请注意,当您使用[Xml...]时,所有DataContractSerializer属性都会被忽略 - 您的示例正在使用它们,因此我假设您使用XmlSerializer

答案 1 :(得分:0)

尝试使用[XmlElement("productName")]

public partial class Products{

   [XmlArray("Product")] 
   [XmlElement("productName")]
   public List<string> productName { get; set; }
}