我无法从我的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>
答案 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
。并且每个人都有Value
或MultiValue
个孩子中的一个或两个。
你想要的是数组是一个元素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
对象可以同时设置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>
可以向后解释为1个对象Value
设置,1个对象同时设置Value
和MultiValue
错误,或者设置为Value
的1个对象,设置了Value
的1个对象和设置了MultiValue
的1个对象是正确的。但XML解析器无法知道哪种解释是正确的。如果您完全知道,您的对象将始终只有1个属性集,您可以使用实现的一个属性规则编写自己的Serializator和Deserializator。