C#Serialization从结果中删除属性名称

时间:2016-07-28 06:39:23

标签: c# xml xml-serialization removeclass

我无法从我的xml中删除 clsProduct 中的属性的名称。我尝试将[XmlElement(ElementName = "Values", Type = typeof(clsValues)]用于我的List<clsValues>,但它没有给我我需要的结果。

您可以在下面看到我需要的结果。

我的序列化类的一部分:

[Serializable]
public class clsProduct
{
    [XmlAttribute("ID")]
    public string ID { get; set; }

    [XmlAttribute("UserTypeID")]
    public string UserTypeID { get; set; }

    [XmlArrayItem(ElementName = "Values", Type = typeof(clsValues))]
    public List<clsValues> Values { get; set; }

}

[Serializable]
public class clsValues
{
    [XmlElement(ElementName = "Value")]
    public clsValue Value { get; set; }

    [XmlArray(ElementName = "MultiValue"),
    XmlArrayItem(ElementName = "Value")]
    public List<clsValue> MultiValue { get; set; }
}

[Serializable]
public class clsValue
{
    [XmlAttribute("AttributeID")]
    public string AttributeID { get; set; }

    [XmlText]
    public string Value { get; set; }
}

我当前的xml结果:

<Product ID="PROD-01111010" UserTypeID="Product">
   <Values>
     <Values>
        <Value AttributeID="ATTR-7196">201607280755</Value>
     </Values>
     <Values>
        <Value AttributeID="ATTR-6236">PTFE 125 + 25% GF, Platte</Value>
     </Values>
     <Values>
        <MultiValue>
            <Value>PLATTE</Value>
            <Value>LUBRIFLON 225</Value>
            <Value>PLAQUE</Value>
            <Value>LUBRIFLON 22</Value>
        </MultiValue>
     </Values>
  </Values>
</Product>

我需要的结果:

<Product ID="PROD-01111010" UserTypeID="Product">
  <Values>
     <Value AttributeID="ATTR-7196">201607280755</Value>
     <Value AttributeID="ATTR-6236">PTFE 125 + 25% GF, Platte</Value>
     <MultiValue>
        <Value>PLATTE</Value>
        <Value>LUBRIFLON 225</Value>
        <Value>PLAQUE</Value>
        <Value>LUBRIFLON 22</Value>
     </MultiValue>
   </Values>
 </Product>

有人可以帮忙吗?

由于

编辑: 我正在使用时

[XmlElement(ElementName = "Values", Type = typeof(clsValues))] public List<clsValues> Values { get; set; }

而不是XmlArrayItem我得到了这个结果:

<Product ID="PROD-01111010" UserTypeID="Product">
     <Values>
        <Value AttributeID="ATTR-7196">201607280755</Value>
     </Values>
     <Values>
        <Value AttributeID="ATTR-6236">PTFE 125 + 25% GF, Platte</Value>
     </Values>
     <Values>
        <MultiValue>
            <Value>PLATTE</Value>
            <Value>LUBRIFLON 225</Value>
            <Value>PLAQUE</Value>
            <Value>LUBRIFLON 22</Value>
        </MultiValue>
     </Values>
</Product>

4 个答案:

答案 0 :(得分:1)

可能你应该使用

[XmlElement(ElementName = "Values", Type = typeof(clsValues))]
public List<clsValues> Values { get; set; }

而不是

[XmlArrayItem(ElementName = "Values", Type = typeof(clsValues))]

答案 1 :(得分:1)

您的问题与此属性有关:

[XmlArrayItem(ElementName = "Values", Type = typeof(clsValues))]
public List<clsValues> Values { get; set; }

暗示有名为Values多个元素具有特定类型clsValues。并且每个人都有ValueMultiValue个孩子中的一个或两个。

你想要的是数组是一个元素Values,而数组项是你两种不同元素类型之间的选择 - 它要么包含Value元素或MultiValue元素。

您可以这样构建以实现:

public class Product
{
    [XmlAttribute("ID")]
    public string Id { get; set; }

    [XmlAttribute("UserTypeID")]
    public string UserTypeId { get; set; }

    [XmlArray("Values")]
    [XmlArrayItem("Value", typeof(Value))]
    [XmlArrayItem("MultiValue", typeof(MultiValue))]
    public List<object> Values { get; set; }
}

public class MultiValue
{
    [XmlElement(ElementName = "Value")]
    public List<Value> Values { get; set; }
}

public class Value
{
    [XmlAttribute("AttributeID")]
    public string AttributeId { get; set; }

    [XmlText]
    public string Text { get; set; }
}

有关正常工作的演示,请参阅this fiddle

答案 2 :(得分:0)

试试xml linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            XElement values = doc.Descendants("Values").FirstOrDefault();
            List<XElement> elements = values.Elements().ToList();
            for (int index = elements.Count() - 1; index >= 0; index--)
            {
                elements[index].ReplaceWith(elements[index].Elements());
            }
        }
    }
}

答案 3 :(得分:0)

原因,为什么它是这样的序列化,是因为XML使用第二个<Values></Values>作为分隔符。这是必需的,因为您的clsValues对象可以同时设置ValueMultiValue属性。在那种情况下,XML是您所需的格式

<Product ID="PROD-01111010" UserTypeID="Product">
  <Values>
     <Value AttributeID="ATTR-7196">201607280755</Value>
     <Value AttributeID="ATTR-6236">PTFE 125 + 25% GF, Platte</Value>
     <MultiValue>
        <Value>PLATTE</Value>
        <Value>LUBRIFLON 225</Value>
        <Value>PLAQUE</Value>
        <Value>LUBRIFLON 22</Value>
     </MultiValue>
   </Values>
 </Product>

可以向后解释为1个对象Value设置,1个对象同时设置ValueMultiValue错误,或者设置为Value的1个对象,设置了Value的1个对象和设置了MultiValue的1个对象是正确的。但XML解析器无法知道哪种解释是正确的。如果您完全知道,您的对象将始终只有1个属性集,您可以使用实现的一个属性规则编写自己的Serializator和Deserializator。