c# - 反序列化 XML 时绕过特定的父节点?
问题描述
假设以下 XML:
<A>
<B>
<B1>b1Value</B1>
<B2>b2Value</B2>
<B3>b3Value</B3>
</B>
<C Attr="val1"/>
<C Attr="val2"/>
<C Attr="val3"/>
</A>
以及以下所需的反序列化类:
public class C
{
[XmlAttribute]
public string Attr { get; set; }
}
[XmlRoot]
public class A
{
[XmlElement("C")]
public C[] Cs { get; set; }
public string B1 { get; set; }
public string B2 { get; set; }
public string B3 { get; set; }
}
如何反序列化 XML 以使我的 A 类具有属性 B1、B2 和 B3,而没有父属性 B?
当我使用此代码时:
string xml =
@"<A>
<B>
<B1>b1Value</B1>
<B2>b2Value</B2>
<B3>b3Value</B3>
</B>
<C Attr=""val1""/>
<C Attr=""val2""/>
<C Attr=""val3""/>
</A>";
XmlSerializer serializer = new XmlSerializer(typeof(A));
A a;
using (TextReader reader = new StringReader(xml))
{
a = serializer.Deserialize(reader) as A;
}
所有 BX 属性都是空白的。
谢谢。
解决方案
您可以添加只读属性以访问所需级别的数据。
public class C
{
[XmlAttribute]
public string Attr { get; set; }
}
public class B
{
[XmlElement]
public string B1 { get; set; }
[XmlElement]
public string B2 { get; set; }
[XmlElement]
public string B3 { get; set; }
}
[XmlRoot]
public class A
{
[XmlElement("C")]
public C[] Cs { get; set; }
[XmlElement("B")]
public B B { get; set; }
[XmlIgnore()]
public string B1 => B?.B1;
[XmlIgnore()]
public string B2 => B?.B2;
[XmlIgnore()]
public string B3 => B?.B3;
}
推荐阅读
- java - 实现回调以避免强制关闭,同时报告崩溃并显示支持屏幕
- java - 如果窗口被调整大小,JLabel 会自我复制
- c++ - 我们可以访问不存在的类类型对象的成员吗?
- python - 无法在文件 tensorflow/core/kernels/mkl_relu_op.cc:873 中初始化内存原语描述符
- tsql - 标量值函数不返回 NULL,而是返回“NULL”字符串
- python - Tornado 不显示静态文件
- postgresql - How to rollback on micro service when some http requests are successful and some http requests are fail by using jdbcTemplate
- google-apps-script - Google 表格 - Mailchimp API - 创建模板
- reactjs - React-router,带有 namspace 的可选 url 参数
- python - 将 MySQL 与 PYTHON 一起使用 - MySQL 连接器的问题