Skip to main content
 首页 » 编程设计

c#之XML 包装的集合不反序列化

2024年02月01日26jyk

我有一些以下格式的 XML:

<PurchaseItem> 
    <Name>Item 1</Name> 
    <Costs> 
        <Cost> 
            <Code>A</Code> 
            <Info>Test 1</Info> 
        </Cost> 
        <Cost> 
            <Code>B</Code> 
            <Info>Test 1</Info> 
        </Cost> 
        <Cost> 
            <Code>C</Code> 
            <Info>Test 1</Info> 
        </Cost> 
    </Costs> 
</PurchaseItem> 

我希望将此 XML 反序列化为以下类:

public class PurchaseItem 
{ 
    [XmlElement("Name")] 
    public string Name { get; set; } 
 
    [XmlElement("Costs")] 
    public Cost[] Costs { get; set; }  
} 
 
public class Cost 
{ 
    [XmlElement("Code")] 
    public string Code{ get; set; } 
 
    [XmlElement("Info")] 
    public string Info{ get; set; } 
} 

但是我似乎无法让它工作,除非我让另一个类作为 Cost[] 的包装器。 我怎样才能像上面的代码那样在 PurchaseItem 类中序列化成本数组?

请您参考如下方法:

你正在定义一个数组,你应该使用[XmlArray]属性:)

[Serializable] 
public class Cost 
{ 
    [XmlElement("Code")] 
    public string Code { get; set; } 
 
    [XmlElement("Info")] 
    public string Info { get; set; } 
} 
 
[Serializable] 
public class PurchaseItem 
{ 
    [XmlElement("Name")] 
    public string Name { get; set; } 
 
    // XmlArray of Cost 
    [XmlArray(ElementName = "Costs")] 
    public Cost[] Costs { get; set; } 
} 
 
public class Tests 
{ 
 
    [Test] 
    public void Test() 
    { 
        var serializer = new XmlSerializer(typeof (PurchaseItem)); 
 
        var xml = @"<PurchaseItem> 
                        <Name>Item 1</Name> 
                        <Costs> 
                            <Cost> 
                                <Code>A</Code> 
                                <Info>Test 1</Info> 
                            </Cost> 
                            <Cost> 
                                <Code>B</Code> 
                                <Info>Test 1</Info> 
                            </Cost> 
                            <Cost> 
                                <Code>C</Code> 
                                <Info>Test 1</Info> 
                            </Cost> 
                        </Costs> 
                    </PurchaseItem>"; 
 
        var data = Encoding.UTF8.GetBytes(xml); 
        var reader = XmlReader.Create(new MemoryStream(data)); 
        var item = (PurchaseItem) serializer.Deserialize(reader); 
 
        Assert.AreEqual(item.Costs[0].Code, "A"); 
        Assert.AreEqual(item.Costs[1].Code, "B"); 
        Assert.AreEqual(item.Costs[2].Code, "C"); 
    } 
 
}