将 XML 数据转换为 C# 类

Posted

技术标签:

【中文标题】将 XML 数据转换为 C# 类【英文标题】:Convert XML data to C# class 【发布时间】:2019-01-25 16:15:17 【问题描述】:

我的项目是 Asp.net Core 我想,XML 数据有一个节点 PersonelInfo 我尝试读取 XML,但它的代码不起作用。 我该如何解决这个代码?我的问题是什么?

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)
     

public class PersonelInfo

  public string PersonelCode  get; set; 
  public string Email  get; set; 

xmlGetDetailsUser.InnerXml 有这个值:

<?xml version=\"1.0\" encoding=\"utf-8\"?>
<ArrayOfPersonelInfo xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"sample url .....\">
    <PersonelInfo>
        <PersonelCode>99999</PersonelCode>    
        <Email>test@test.com</Email>        
    </PersonelInfo>
</ArrayOfPersonelInfo>

当运行我的程序时,在 try catch 中显示此异常

XML 中有错误

【问题讨论】:

Convert XML String to Object的可能重复 转义的" 字符是否是原因? inner XML 实际上包含&lt;? xml ... ?&gt; 声明会很奇怪。你能发布完整的 XML 吗? @DaisyShipton 是完整的 XML @SebastianHofmann 转义的“字符是什么意思? 【参考方案1】:

您应该为XmlSerializer 设置命名空间并将其类型更改为List&lt;PersonelInfo&gt;

试试这个:

XmlSerializer serializer = new XmlSerializer(typeof(List<PersonelInfo>), "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<PersonelInfo>)serializer.Deserialize(xmlReader);
                
            

【讨论】:

【参考方案2】:

我找到了答案,但是 这似乎不是将 XML 转换为 C# 的好方法 你觉得如何改进这段代码?

var xmlGetDetailsUser = new XmlDocument();
xmlGetDetailsUser.LoadXml(await responseMessageGetDetailsUser.Content.ReadAsStringAsync());
var result = xmlGetDetailsUser.GetElementsByTagName("PersonelInfo");
XmlSerializer serializer = new XmlSerializer(typeof(PersonelInfo));
var personelInfo = new PersonelInfo();
personelInfo.PersonelCode = result.Item(0)["PersonelCode"].InnerText;
personelInfo.Email = result.Item(0)["Email"].InnerText;

【讨论】:

你能告诉我们web service的方法定义吗?它会返回一个数组还是一个对象?对于 xml,它似乎是数组而不是对象。试试responseMessageGetDetailsUser.Content.ReadAsAsync&lt;PersonelInfo&gt;()responseMessageGetDetailsUser.Content.ReadAsAsync&lt;IList&lt;PersonelInfo&gt;&gt;() @TaoZhou My Webservice 返回类数组

以上是关于将 XML 数据转换为 C# 类的主要内容,如果未能解决你的问题,请参考以下文章

用于将 XML 数据转换为 html 文件的 C# 与 XSLT [关闭]

如何将 XML/JSON 文件转换为 C# 类?

将带有命名空间和属性的 XML 转换为 C# 模型类

将 XML 转换为动态 C# 对象

在 C# 中将 JSON 数组转换为 XML

将 XML 转换为 c# 对象