c# - XmlSerializer 访问父元素中的子逻辑元素
问题描述
我正在使用标准 .NETXmlSerializer
反序列化以下 xml:
<root>
<Element>
<Grouping1>
<Item1>First</Item1>
<Item2>Second</Item2>
</Grouping1>
<Grouping2>
<Item3>Third</Item3>
</Grouping2>
</Element>
</root>
我想将其序列化为以下类:
class Element
{
[XmlElement("Item1")]
public string Item1 { get; set; }
[XmlElement("Item2")]
public string Item2 { get; set; }
[XmlElement("Item3")]
public string Item3 { get; set; }
}
这当然不起作用,因为 - 例如 -<Item1>
不在逻辑容器中,<Element>
而是在逻辑容器中<Grouping1>
。
问题:
有没有办法告诉在元素XmlSerializer
中寻找?有些东西打断了Item1
<Grouping1>
[XmlElement("Grouping1.Item1")]
PS:我不想创建一个Grouping1
类(如此处所建议的),因为分组只是逻辑容器,不应该有自己的类。
解决方案
使用 XML Linq。自定义序列化程序会复杂得多
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication4
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
List<Element> elements = doc.Descendants("Element").Select(x => new Element()
{
Item1 = (string)x.Descendants("Item1").FirstOrDefault(),
Item2 = (string)x.Descendants("Item2").FirstOrDefault(),
Item3 = (string)x.Descendants("Item3").FirstOrDefault()
}).ToList();
}
}
class Element
{
public string Item1 { get; set; }
public string Item2 { get; set; }
public string Item3 { get; set; }
}
}
这是序列化程序的样子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
using System.Xml.Schema;
namespace ConsoleApplication4
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XmlReader reader = XmlReader.Create(FILENAME);
XmlSerializer serializer = new XmlSerializer(typeof(Root));
Root root = (Root)serializer.Deserialize(reader);
}
}
[XmlRoot("root")]
public class Root
{
[XmlElement("Element")]
public List<Element> Element { get; set; }
}
public class Element : IXmlSerializable
{
private string Item1 { get; set; }
private string Item2 { get; set; }
private string Item3 { get; set; }
public void WriteXml(XmlWriter writer)
{
XElement element = new XElement("Element", new object[] {
new XElement("Grouping1", new object[] {
new XElement("Item1", Item1),
new XElement("Item2", Item2)
}),
new XElement("Grouping2", new XElement("Item3", Item3))
});
element.WriteTo(writer);
}
public void ReadXml(XmlReader reader)
{
XElement element = (XElement)XElement.ReadFrom(reader);
Item1 = (string)element.Descendants("Item1").FirstOrDefault();
Item2 = (string)element.Descendants("Item2").FirstOrDefault();
Item3 = (string)element.Descendants("Item3").FirstOrDefault();
}
public XmlSchema GetSchema()
{
return (null);
}
}
}
推荐阅读
- javascript - 如何在另一个网页中打开网页而不向外界透露
- android - 如何在 android oreo 的锁定屏幕上显示音乐播放器之类的通知?
- coffeescript - Coffeescript 将数组转换为字典,其中字典将具有多个值
- javascript - 在父级 HTML 字符串之间的特定点附加 DOM 元素
- deep-learning - Darkflow 已完美安装和导入。但是 TFNet 不是从 darkflow.net.build 导入的
- mongodb - 已解决:如何创建没有卷的 Mongodb docker 容器
- python - 如何使用模板标签在 django 表单上填充“占位符”
- java - java.sql.SQLSyntaxErrorException:“字段列表”中的未知列“column_name”-实体中的映射与数据库中的映射相同
- mariadb - 为现有的 mariadb 数据库创建集群
- android - 为什么此测试会触发 Robolectric 委托运行程序 RuntimeException?