C# 序列化从结果中删除属性名称
C# Serialization Remove attribute name from result
我无法从我的 xml 中删除 clsProduct 中的属性 Values 的名称。我尝试使用 [XmlElement(ElementName = "Values", Type = typeof(clsValues)]
作为我的 List<clsValues>
,但它没有给我我需要的结果。
你可以在下面看到我需要的结果。
我的部分连载class:
[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>
尝试 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());
}
}
}
}
也许你应该使用
[XmlElement(ElementName = "Values", Type = typeof(clsValues))]
public List<clsValues> Values { get; set; }
而不是
[XmlArrayItem(ElementName = "Values", Type = typeof(clsValues))]
之所以这样序列化,是因为 XML 使用第二个 <Values></Values>
作为分隔符。这是必需的,因为您的 clsValues
对象可以同时设置 Value
和 MultiValue
属性。在那种情况下 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>
可以向后解释为设置了 Value
的 1 个对象和设置了 Value
和 MultiValue
的 1 个对象,这是错误的,或者解释为设置了 Value
的 1 个对象设置,1 个对象设置为 Value
和 1 个对象设置为 MultiValue
,这是正确的。但是 XML 解析器无法知道哪种解释是正确的。如果您确实知道您的对象将始终只有 1 个 属性 集,您可以编写自己的序列化器和反序列化器并实现一个 属性 规则。
您的问题与此有关属性:
[XmlArrayItem(ElementName = "Values", Type = typeof(clsValues))]
public List<clsValues> Values { get; set; }
这意味着有 多个 个名为 Values
的元素具有特定类型 clsValues
。其中每一个都有 Value
或 MultiValue
children.
中的一个或两个
你想要的是 array 是一个元素 Values
而 array items 是一个选择您的两种不同的元素类型 - 它包含一个 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。
我无法从我的 xml 中删除 clsProduct 中的属性 Values 的名称。我尝试使用 [XmlElement(ElementName = "Values", Type = typeof(clsValues)]
作为我的 List<clsValues>
,但它没有给我我需要的结果。
你可以在下面看到我需要的结果。
我的部分连载class:
[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>
尝试 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());
}
}
}
}
也许你应该使用
[XmlElement(ElementName = "Values", Type = typeof(clsValues))]
public List<clsValues> Values { get; set; }
而不是
[XmlArrayItem(ElementName = "Values", Type = typeof(clsValues))]
之所以这样序列化,是因为 XML 使用第二个 <Values></Values>
作为分隔符。这是必需的,因为您的 clsValues
对象可以同时设置 Value
和 MultiValue
属性。在那种情况下 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>
可以向后解释为设置了 Value
的 1 个对象和设置了 Value
和 MultiValue
的 1 个对象,这是错误的,或者解释为设置了 Value
的 1 个对象设置,1 个对象设置为 Value
和 1 个对象设置为 MultiValue
,这是正确的。但是 XML 解析器无法知道哪种解释是正确的。如果您确实知道您的对象将始终只有 1 个 属性 集,您可以编写自己的序列化器和反序列化器并实现一个 属性 规则。
您的问题与此有关属性:
[XmlArrayItem(ElementName = "Values", Type = typeof(clsValues))]
public List<clsValues> Values { get; set; }
这意味着有 多个 个名为 Values
的元素具有特定类型 clsValues
。其中每一个都有 Value
或 MultiValue
children.
你想要的是 array 是一个元素 Values
而 array items 是一个选择您的两种不同的元素类型 - 它包含一个 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。