将XML数据转换为C#类
将XML数据转换为C#类
我的项目是Asp.net Core。我想将XML数据转换为C#类,XML数据有一个节点PersonelInfo
,我尝试读取XML,但代码无效。我该如何解决这个问题?我的问题是什么?\n
var xmlGetDetailsUser = new XmlDocument(); xmlGetDetailsUser.LoadXml(await responseMessageGetDetailsUser.Content.ReadAsStringAsync()); using (StringReader reader = new StringReader(xmlGetDetailsUser.InnerXml)) { try { PersonelInfo data = (PersonelInfo)(serializer.Deserialize(reader)); } catch (System.Exception e) { } }
\n类\n
public class PersonelInfo { public string PersonelCode { get; set; } public string Email { get; set; } }
\nxmlGetDetailsUser.InnerXml
的值为:\n
99999 test@test.com
\n当运行我的程序时,在try catch中显示以下异常:\n
XML中存在错误
问题的出现原因是代码中使用的方法不够好,无法将XML转换为C#类。现在作者希望改进这段代码,并询问读者对于改进的看法。还有Web服务的方法定义,询问其返回的是一个数组还是一个对象,并建议尝试使用其他方法来进行转换。
要解决这个问题,我们可以考虑使用更好的方法来将XML数据转换为C#类。一种可能的解决方法是使用.NET的内置功能,如XmlSerializer类来完成转换。
以下是改进后的代码示例:
var xmlGetDetailsUser = new XmlDocument(); xmlGetDetailsUser.LoadXml(await responseMessageGetDetailsUser.Content.ReadAsStringAsync()); var result = xmlGetDetailsUser.GetElementsByTagName("PersonelInfo"); XmlSerializer serializer = new XmlSerializer(typeof(PersonelInfo)); var personelInfo = (PersonelInfo)serializer.Deserialize(new XmlNodeReader(result.Item(0)));
这段代码使用XmlSerializer类来进行XML到C#类的转换。首先,我们需要加载XML数据并获取到PersonelInfo节点。然后,我们创建一个XmlSerializer对象,指定要进行转换的类型。最后,我们使用Deserialize方法将PersonelInfo节点转换为C#类的对象。
另外,还有Web服务的方法定义问题。根据作者提供的信息,该Web服务返回的是一个类的数组。因此,我们可以尝试使用responseMessageGetDetailsUser.Content.ReadAsAsync<PersonelInfo[]>()方法来进行转换。
通过使用XmlSerializer类和适当的方法来进行转换,我们可以更好地将XML数据转换为C#类,并解决这个问题。同时,根据Web服务的方法定义,我们可以选择合适的方法来处理返回的数据。
问题:将XML数据转换为C#类的问题是什么?
原因:没有为XmlSerializer设置命名空间,并且将其类型更改为List
解决方法:
XmlSerializer serializer = new XmlSerializer(typeof(List), "sample url ...."); XmlReaderSettings settings = new XmlReaderSettings(); using (StringReader textReader = new StringReader(await responseMessageGetDetailsUser.Content.ReadAsStringAsync())) { using (XmlReader xmlReader = XmlReader.Create(textReader, settings)) { var data = (List )serializer.Deserialize(xmlReader); } }
以上代码将为XmlSerializer设置命名空间,并将其类型更改为List