反序列化 XML 时遇到问题。无法理解如何制作财产data
根据 xml 属性不同id
xds 生成一个公共属性data
结合了数据 UserInfo + 数据 UserTransactions 的属性
尝试过解决方案this线程但没有运气
XML 示例:
<?xml version="1.0" encoding="UTF-8"?>
<document>
<data id="UserInfo">
<rows>
<row id="123" Name="Alex" phone="+1234567890"></row>
<row id="321" Name="Sally" phone="+1234567890"></row>
<rows>
</data>
<data id="UserTransactions">
<rows>
<row UserId="123" amount="100.1" date="2022-07-03"></row>
<row UserId="123" amount="-100.1" date="2022-07-03"></row>
<row UserId="321" amount="1" date="2022-07-03"></row>
<rows>
</data>
</document>
问题:是否可以反序列化到某个具有基于 xml 属性的属性的类?
例如有些像:
public class document
{
// based on <data id='UserInfo'>
public UserInfoRow[] dataUserInfos { get; set; }
// based on <data id='UserTransaction'>
public UserTransactionRow[] dataUserTransactions { get; set; }
}
我尝试过的代码
namespace test
{
public class document
{
[XmlElement("data")]
public documentData[] data { get; set; }
}
public class documentData
{
[XmlAttribute("id")]
public string id { get; set; }
[XmlArray("rows")]
[XmlArrayItem("row")]
public row[] rows { get; set; }
}
[XmlInclude(typeof(UserInfoRow)), XmlInclude(typeof(UserTransactionRow))]
public class row { }
public class UserInfoRow : row
{
[XmlAttribute("id")]
public string id { get; set; }
[XmlAttribute("Name")]
public string Name { get; set; }
[XmlAttribute("phone")]
public string phone { get; set; }
}
public class UserTransactionRow : row
{
[XmlAttribute("UserId")]
public string UserId { get; set; }
[XmlAttribute("amount")]
public string amount { get; set; }
[XmlAttribute("date")]
public string date { get; set; }
}
}
没有来自结束课程的信息
![Watch](https://i.stack.imgur.com/crBmf.png)
您不能在 xml 中使用继承的类。继承的类需要 xml 中的 type 属性。相反,您可以使用自定义 IXmlSerialize,如下面的代码
using System;
using System.Linq;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;
namespace ConsoleApp2
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreWhitespace = true;
XmlReader reader = XmlReader.Create(FILENAME);
XmlSerializer serializer = new XmlSerializer(typeof(test.document));
test.document doc = (test.document)serializer.Deserialize(reader);
}
}
}
namespace test
{
public class document
{
[XmlElement("data")]
public documentData[] data { get; set; }
}
public class documentData : IXmlSerializable
{
[XmlAttribute("id")]
public string id { get; set; }
public List<UserInfoRow> userInfoRows { get; set; }
public List<UserTransactionRow> userTransactionRows { get; set; }
public void WriteXml(XmlWriter writer)
{
}
public void ReadXml(XmlReader reader)
{
id = reader.GetAttribute("id");
XmlSerializer serializer = null;
XmlReader xmlChildReader = null;
switch (id)
{
case "UserInfo":
serializer = new XmlSerializer(typeof(UserInfoRow)) ;
xmlChildReader = reader.ReadSubtree();
while (xmlChildReader.ReadToFollowing("row"))
{
UserInfoRow userRow = (UserInfoRow)serializer.Deserialize(xmlChildReader);
if (userInfoRows == null) userInfoRows = new List<UserInfoRow>();
userInfoRows.Add(userRow);
}
break;
case "UserTransactions":
serializer = new XmlSerializer(typeof(UserTransactionRow));
xmlChildReader = reader.ReadSubtree();
while (xmlChildReader.ReadToFollowing("row"))
{
UserTransactionRow userRow = (UserTransactionRow)serializer.Deserialize(xmlChildReader);
if (userTransactionRows == null) userTransactionRows = new List<UserTransactionRow>();
userTransactionRows.Add(userRow);
}
break;
}
reader.ReadEndElement();
}
public XmlSchema GetSchema()
{
return (null);
}
}
[XmlRoot("row")]
public class UserInfoRow
{
[XmlAttribute("id")]
public string id { get; set; }
[XmlAttribute("Name")]
public string Name { get; set; }
[XmlAttribute("phone")]
public string phone { get; set; }
}
[XmlRoot("row")]
public class UserTransactionRow
{
[XmlAttribute("UserId")]
public string UserId { get; set; }
[XmlAttribute("amount")]
public string amount { get; set; }
[XmlAttribute("date")]
public string date { get; set; }
}
}
这是另一个更紧凑的解决方案。我删除了 documentData 类
using System;
using System.Linq;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;
namespace ConsoleApp2
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreWhitespace = true;
XmlReader reader = XmlReader.Create(FILENAME);
XmlSerializer serializer = new XmlSerializer(typeof(test.document));
test.document doc = (test.document)serializer.Deserialize(reader);
}
}
}
namespace test
{
public class document : IXmlSerializable
{
public string id { get; set; }
public List<UserInfoRow> userInfoRows { get; set; }
public List<UserTransactionRow> userTransactionRows { get; set; }
public void WriteXml(XmlWriter writer)
{
}
public void ReadXml(XmlReader reader)
{
XmlSerializer serializer = null;
XmlReader xmlChildReader = null;
while (reader.ReadToFollowing("data"))
{
id = reader.GetAttribute("id");
switch (id)
{
case "UserInfo":
serializer = new XmlSerializer(typeof(UserInfoRow));
xmlChildReader = reader.ReadSubtree();
while (xmlChildReader.ReadToFollowing("row"))
{
UserInfoRow userRow = (UserInfoRow)serializer.Deserialize(xmlChildReader);
if (userInfoRows == null) userInfoRows = new List<UserInfoRow>();
userInfoRows.Add(userRow);
}
break;
case "UserTransactions":
serializer = new XmlSerializer(typeof(UserTransactionRow));
xmlChildReader = reader.ReadSubtree();
while (xmlChildReader.ReadToFollowing("row"))
{
UserTransactionRow userRow = (UserTransactionRow)serializer.Deserialize(xmlChildReader);
if (userTransactionRows == null) userTransactionRows = new List<UserTransactionRow>();
userTransactionRows.Add(userRow);
}
break;
}
}
}
public XmlSchema GetSchema()
{
return (null);
}
}
[XmlRoot("row")]
public class UserInfoRow
{
[XmlAttribute("id")]
public string id { get; set; }
[XmlAttribute("Name")]
public string Name { get; set; }
[XmlAttribute("phone")]
public string phone { get; set; }
}
[XmlRoot("row")]
public class UserTransactionRow
{
[XmlAttribute("UserId")]
public string UserId { get; set; }
[XmlAttribute("amount")]
public string amount { get; set; }
[XmlAttribute("date")]
public string date { get; set; }
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)