在 XML 反序列化中将 XML 节点的值设置为 C# 模型上的字段
Set value of XML node as field on C# model in XML deserialization
我希望正确反序列化一些 XML。
部分 XML 如下所示:
<Keys>
<Key>
<Name>Test 1</Name>
<KeyValues>
<KeyValue Offered="true" Order="1">One</KeyValue>
<KeyValue Offered="true" Order="2">Two</KeyValue>
<KeyValue Offered="true" Order="3">Three</KeyValue>
<KeyValue Offered="true" Order="4">Four</KeyValue>
</KeyValues>
</Key>
<Key>
<Name>Test 2</Name>
<KeyValues>
<KeyValue Offered="true">One</KeyValue>
</KeyValues>
</Key>
</Keys>
我想将其中的每个 KeyValue 反序列化为如下所示的 C# 对象:
public class KeyValue
{
public string Value { get; set; }
[XmlAttribute]
public int Order { get; set; }
[XmlAttribute]
public bool Offered { get; set; }
}
这是(大致)我用来反序列化的代码:
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
using (TextReader reader = new StringReader(xml))
{
myObject = (MyObject)serializer.Deserialize(reader);
}
这几乎可以正常工作了。没有抛出异常并且正确设置了 Order 和 Offered,但我希望 XML 中的 KeyValues 中的一、二、三等进入我模型的值字段。
这可能吗?如果可以,我该怎么做?
根据 Robert Harvey 的评论查看 this website 后,我意识到我缺少的是我的值字段上的 [XmlText]
属性。我添加了那个,经过测试,它起作用了。
在这种情况下我不会使用序列化,因为它需要我的 类 然后是其他方法。请参阅下面的 xml linq 解决方案:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication110
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
List<Key> keys = doc.Descendants("Key").Select(x => new Key()
{
Name = (string)x.Element("Name"),
Values = x.Descendants("KeyValue").Select(y => new KeyValue() {
Value = (string)y,
Offered = (bool)y.Attribute("Offered"),
Order = (int?)y.Attribute("Order")
}).ToList()
}).ToList();
}
}
public class Key
{
public string Name { get; set; }
public List<KeyValue> Values { get;set;}
}
public class KeyValue
{
public string Value { get; set; }
public int? Order { get; set; }
public bool Offered { get; set; }
}
}
我希望正确反序列化一些 XML。
部分 XML 如下所示:
<Keys>
<Key>
<Name>Test 1</Name>
<KeyValues>
<KeyValue Offered="true" Order="1">One</KeyValue>
<KeyValue Offered="true" Order="2">Two</KeyValue>
<KeyValue Offered="true" Order="3">Three</KeyValue>
<KeyValue Offered="true" Order="4">Four</KeyValue>
</KeyValues>
</Key>
<Key>
<Name>Test 2</Name>
<KeyValues>
<KeyValue Offered="true">One</KeyValue>
</KeyValues>
</Key>
</Keys>
我想将其中的每个 KeyValue 反序列化为如下所示的 C# 对象:
public class KeyValue
{
public string Value { get; set; }
[XmlAttribute]
public int Order { get; set; }
[XmlAttribute]
public bool Offered { get; set; }
}
这是(大致)我用来反序列化的代码:
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
using (TextReader reader = new StringReader(xml))
{
myObject = (MyObject)serializer.Deserialize(reader);
}
这几乎可以正常工作了。没有抛出异常并且正确设置了 Order 和 Offered,但我希望 XML 中的 KeyValues 中的一、二、三等进入我模型的值字段。
这可能吗?如果可以,我该怎么做?
根据 Robert Harvey 的评论查看 this website 后,我意识到我缺少的是我的值字段上的 [XmlText]
属性。我添加了那个,经过测试,它起作用了。
在这种情况下我不会使用序列化,因为它需要我的 类 然后是其他方法。请参阅下面的 xml linq 解决方案:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication110
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
List<Key> keys = doc.Descendants("Key").Select(x => new Key()
{
Name = (string)x.Element("Name"),
Values = x.Descendants("KeyValue").Select(y => new KeyValue() {
Value = (string)y,
Offered = (bool)y.Attribute("Offered"),
Order = (int?)y.Attribute("Order")
}).ToList()
}).ToList();
}
}
public class Key
{
public string Name { get; set; }
public List<KeyValue> Values { get;set;}
}
public class KeyValue
{
public string Value { get; set; }
public int? Order { get; set; }
public bool Offered { get; set; }
}
}