在序列化ASP.NET的WebAPI对象修改XML数组元素名(Modify the xml arra

2019-07-30 13:33发布

我一直在努力,在我的WebAPI控制器返回对象的列表时,输出的自定义XML根元素。

我控制器的方法看起来是这样的:

    public List<Product> Get()
    {
        return repository.GetProducts();
    }

这使得这样的XML输出:

<ArrayOfProduct>
  <Product>
    <Name>Product1</Name>
  </Product>
  <Product>
    <Name>Product2</Name>
  </Product>
</ArrayOfProduct>

我想改<ArrayOfProduct><Products> ,但还没有找到这样的一种方式。

我已经尝试了不同的变化DataContractDataMember属性无济于事。

有谁知道是否有做我想要的东西的一种方式,短包我的List<Product>对象在一个新的类并返回一个呢?

Answer 1:

class Program
{
    static void Main(string[] args)
    {
        HttpConfiguration config = new HttpConfiguration();

        DataContractSerializer productsSerializer = new DataContractSerializer(typeof(List<Product>), "Products", String.Empty);
        config.Formatters.XmlFormatter.SetSerializer(typeof(List<Product>), productsSerializer);

        config.Formatters.XmlFormatter.Indent = true;

        config.Formatters.XmlFormatter.WriteToStreamAsync(
            typeof(List<Product>),
            new List<Product> { new Product { Name = "Product1" }, new Product { Name = "Product2" } },
            Console.OpenStandardOutput(),
            null,
            null).Wait();

        Console.WriteLine();
    }
}

[DataContract(Namespace = "")]
public class Product
{
    [DataMember]
    public string Name { get; set; }
}


Answer 2:

我知道你不喜欢包装的想法,但没有多少有些使用的包装也使用,这是非常易于使用的XML属性的解决方案。 我拒绝使用下面的方法是使用旧的序列化。

public class Product
{
    [XmlAttribute( "id" )]
    public int Id
    {
        get;
        set;
    }
    [XmlAttribute( "name" )]
    public string Name
    {
        get;
        set;
    }
    [XmlAttribute( "quantity" )]
    public int Quantity
    {
        get;
        set;
    }
}
[XmlRoot( "Products" )]
public class Products
{
    [XmlAttribute( "nid" )]
    public int Id
    {
        get;
        set;
    }
    [XmlElement(ElementName = "Product")]
    public List<Product> AllProducts { get; set; }
}

现在你的控制器可以只返回产品,如:

    public Products Get()
    {
        return new Products
        {
            AllProducts = new List<Product>
            {
                new Product {Id = 1, Name = "Product1", Quantity = 20},
                new Product {Id = 2, Name = "Product2", Quantity = 37},
                new Product {Id = 3, Name = "Product3", Quantity = 6},
                new Product {Id = 4, Name = "Product4", Quantity = 2},
                new Product {Id = 5, Name = "Product5", Quantity = 50},
            }
        };
    }

现在你可以指定开机像这样的串行:

    var productssXmlFormatter = GlobalConfiguration.Configuration.Formatters.XmlFormatter;
    productssXmlFormatter.SetSerializer<Products>( new XmlSerializer( typeof( Products ) ) );

我知道这是不是因为具有指定串行和失去EF和LINQ的flexability的和方便的最理想方式。 或至少具有进行干预,而不是仅仅返回IEnumerable的<>。

我必须给予信贷以下网站作为我第一次听说这种方式从网站: http://justthisguy.co.uk/outputting-custom-xml-net-web-api/

这将导致以下XML:

<Products nid="0">
    <Product id="1" name="Product1" quantity="20"/>
    <Product id="2" name="Product2" quantity="37"/>
    <Product id="3" name="Product3" quantity="6"/>
    <Product id="4" name="Product4" quantity="2"/>
    <Product id="5" name="Product5" quantity="50"/>
 </Products>

请不要忘了看看列出的网站。



Answer 3:

由于难以捉摸的说....

[XmlArray("Products")]
public List<Product> Get()
{
    return repository.GetProducts();
}

如果您有问题,因为它是一种方法,然后尝试重新定义为一个属性,因为它不带任何参数,并可能更有意义。

[XmlArray("Products")]
public List<Product> Products { 
  get {
    return repository.GetProducts();
  }
}

这将列出所有Product命名为“产品”的元素元素中的项目。

<Products>
  <Product>
    <Name>Product1</Name>
  </Product>
  <Product>
    <Name>Product2</Name>
  </Product>
</Products>

PS要重命名的Product ,你可以使用该项目的标签[XmlArrayItem("Product")]属性来做到这一点。 如果你想有一个平坦的列表(不要在“产品”包),你可以使用[XmlElement("Product")]这将列出它们没有对它们进行分组。



Answer 4:

我猜你正在使用NetDataContractSerializer
您可以指定串行的构造函数的根元素名称:

NetDataContractSerializer serializer = new NetDataContractSerializer("Products", "Your.Namespace");

看看该型动物重载:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.netdatacontractserializer.aspx



Answer 5:

我面临着同样的问题,并搜查,但未能找到任何合适的解决方案,因此最后决定用“产品”替换字符串“ArrayOfProduct”,它是工作顺利。

我知道这是不好的方式来做到这一点,但它是快速。



Answer 6:

您应该能够使用XML序列化attirbues所概述这里

它已经有一段时间,因为我已经与他们合作,但他们快速,简单易学。



Answer 7:

请检查了这一点。 有一个关于如何配置以XML格式类的输出一些信息。

https://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute%28v=vs.110%29.aspx

在我看来,这不是关于WEP API,但类的配置。



Answer 8:

我做过很多次,自定义XML序列化输出。 在我的类定义使用属性:

[XmlArray("Products")]
public List<Product> Products
{
    get { return repository.GetProducts(); }
}

这应该让你你正在寻找的输出...



文章来源: Modify the xml array element name in serialized ASP.NET WebAPI object