使用c#反序列化xml中的重复元素

Posted

技术标签:

【中文标题】使用c#反序列化xml中的重复元素【英文标题】:deserialize repeated element in xml using c# 【发布时间】:2021-09-06 21:29:04 【问题描述】:

我收到一条回复,其中包含以下内容:

<carList>
<numberOfRecords>237</numberOfRecords>
<year>1982</year>
<year>1983</year>
<year>1978</year>
<year>1955</year>
<year>1998</year>
</carList>

这是更大的 xml 文档的一部分,我可以对其余部分进行消毒,但这部分我不能。我其余的消毒物品都很好。 这是我的模型:

public class Response 

   [XmlArray( "carList")]
   [XmlArrayItem("year")]
   //[XmlElement("carList")]
   public CarList? CarList  get; set; 

    public class CarList
    
        [XmlElement("numberOfRecords")]
        public int? NumberOfRecords  get; set; 

        [XmlElement("year")]
        public List<string>? Year  get; set; 
    

我的反序列化器:

XmlDeserializer xmldes = new XmlDeserializer();

var deserializedResponse = xmldes.Deserialize<Response>(response);

【问题讨论】:

【参考方案1】:

你只有一个carList,所以应该是:

[XmlElement("carList")]
public CarList? CarList  get; set; 

假设这是一个子节点,而不是根元素(在这种情况下:[XmlRoot("carList")] 位于 CarList 本身,并完全失去 Response

【讨论】:

你是对的,它不是根元素。它是更大的 xml 的一部分。我的 carList 仅包含一些汽车以及年份列表。如果我使用你提到的方式,“NumberofRecords”会被填充,但年份列表是空的 @Pamador 在这里工作正常:gist.github.com/mgravell/0a1d3a1de0cd9ab0614b375dc5425bb8 - 你有没有显示它不起作用的复制品?真正的代码可能是使用 xml 命名空间和/或命名空间前缀吗? 感谢您的评论。如果您指的是根元素,则在根元素上有名称空间。我做了类似的事情,但没有奏效。当我反序列化 xml 时,记录数得到正确的值,但我的列表没有。 @Pamador 命名空间在 xml 反序列化中至关重要;如果您想要与您的数据匹配的代码,则需要显示包含类似于您的场景的示例 xml - 否则 它将不起作用 是的,我在不同的项目中尝试过,和你一样,它在那里工作。这是 xml: w3.org/2001/XMLSchema" xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns="abr.business.gov.au/ABRXMLSearch"> 2680 9543747275738023383928128399196485016505539160306167177

以上是关于使用c#反序列化xml中的重复元素的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# Xml.Serialization 库反序列化每个重复的 XML 节点并将其映射到对象的属性

如何反序列化 C# 中只有属性的 xml 元素?

如何在 C# 中反序列化具有属性的 XML [重复]

在C#中序列化和反序列化之间保留xml元素的顺序

在 C# 中反序列化 XML [重复]

在 C# 中使用换行符对字符串元素进行 XML 反序列化