3

我正在尝试反序列化信用卡箱对象以在表单上进行品牌验证,但无法正确完成。内部对象没有反序列化,或者品牌的主要列表为空。谁能帮我一两个?

我的 XML 是这样的:

<?xml version="1.0" encoding="utf-8"?>
<Brands>
  <Brand type="visa">
    <Bins>
      <Bin enabled="true" value="123" />
      <Bin enabled="true" value="456" />
      <Bin enabled="true" value="789" />
    </Bins>
  </Brand>
  <Brand type="master">
    <Bins>
      <Bin enabled="true" value="987" />
      <Bin enabled="true" value="654" />
      <Bin enabled="true" value="321" />
    </Bins>
  </Brand>
</Brands>

我最新的代码(它带来了brandsCollection null)是:

[XmlRoot("Brands")]
public class CreditCardBrand
{
    [XmlArray("Brands"), XmlArrayItem("Brand")]
    public CreditCardBrandCollection[] brandsCollection { get; set; }
}

public class CreditCardBrandCollection
{
    [XmlElement("Bins")]
    public CreditCardBrandBins[] binsCollection { get; set; }

    [XmlAttribute("type")]
    public CreditCardBrands brand { get; set; }
}

public class CreditCardBrandBins
{
    [XmlAttribute("value")]
    public string bin { get; set; }

    [XmlAttribute("enabled")]
    public bool enabled { get; set; }
}

我想将此 xml 反序列化为一个品牌数组,每个品牌都有一个属性名称(类型)和一个与之关联的 bin 数组(只有启用的那些),所以我可以在启动时将它放在我的系统的内存中。

4

2 回答 2

2

这实际上很容易。你只是混淆了——或者,更好的说法是,重复了——根元素声明和你给brandsCollection数组赋值的方式。您必须按如下方式更改声明:

[XmlRoot("Brands")]
public class CreditCardBrand
{
    [XmlElement("Brand")]
    public CreditCardBrandCollection[] brandsCollection { get; set; }
}

这里[XmlElement]导致数组的每个元素由单个<Brand>标记表示。在您的原始代码中,您描述了一个必须如下所示的 XML:

<Brands>
    <Brands> <!-- duplicate Brands element here -->
        <Brand type="…">…&lt;/Brand>
        <Brand type="…">…&lt;/Brand>
        <Brand type="…">…&lt;/Brand>
        …
    </Brands>
</Brands>
于 2012-10-03T20:19:57.380 回答
2

如果你想使用 Linq2Xml

XDocument xDoc = XDocument.Parse(xml); //or XDocument.Load(filename)
List<CreditCardBrand> brands =
            xDoc.Descendants("Brand")
            .Select(br => new CreditCardBrand()
            {
                Type = br.Attribute("type").Value,
                Bins = br.Descendants("Bin")
                            .Select(b => new CreditCardBin(){
                                Enabled = (bool)b.Attribute("enabled"),
                                Value = b.Attribute("value").Value,
                            }).Where(b => b.Enabled == true)
                            .ToList()

            })
            .ToList();

--

public class CreditCardBrand
{
    public string Type { get; set; }
    public List<CreditCardBin> Bins { get; set; }
}

public class CreditCardBin
{
    public string Value { get; set; }
    public bool Enabled { get; set; }
}
于 2012-10-03T20:20:34.610 回答