XML反序列化为相同对象的不同元素名称

时间:2016-12-22 23:10:55

标签: c# xml xml-serialization

我正在尝试将xml反序列化为要使用的对象。我们已经创建了模板,并希望尽可能使xml保持相同的标准。我想弄清楚的问题是如何查看xml中的标准节点,并且所有子节点都是相同的对象类型,只是使用不同的节点名称。

例如:

<Account>
    <AccountNumber>12345</AccountNumber>
    <Balance>12.52</Balance>
    <LateFee>0</LateFee>
</Account>

帐户级别始终位于模板中,但下面的所有内容都是可变的。有没有办法将帐户级别中的所有节点反序列化为同一个对象?

Public Class AccountNode
{
   Public String Name { get; set; }
   Public String Value { get; set; }
}

根据我的研究,看起来,他们必须有一个标准的命名方案,然后你可以有一个属性来分配给Name值。我还没有能够证实这一点。如果某人有我无法找到的链接,或者知识渊博且可以确认这是否可能,我想知道。

编辑:

我有一个比上面列出的更大的xml,所以我试图看看如何反序列化它。

<AccountNumber>
  <KeyWord Name="Customer Account" isRegex="False" errorAllowance="10" LookFor="Customer Account">
    <Rectangle>
      <Left>200</Left>
      <Bottom>350</Bottom>
      <Right>600</Right>
      <Top>690</Top>
    </Rectangle>
    <Relations KwName="Charges">
      <Relation>above.0</Relation>
    </Relations>
  </KeyWord>
  <Capture DataType="String" FindIfKeywordMissing="false">
    <Rectangle>
      <Left>200</Left>
      <Bottom>350</Bottom>
      <Right>600</Right>
      <Top>690</Top>
    </Rectangle>
    <Relations anchorName="ChargeSection">
      <Relation>rightOf.0</Relation>
      <Relation>below.-20</Relation>
      <Relation>above.20</Relation>
      <Relation>width.150</Relation>
    </Relations>
    <Regex>Customer account\s+(\S+)</Regex>
  </Capture>
</AccountNumber>

所以对于这个,我认为它是相似的,但基本上帐号编号节点是变量1,它上面和下面的所有内容都是标准的。

1 个答案:

答案 0 :(得分:1)

您可以在[XmlAnyElement] public XElement[] AccountNodesXml类中使用代理Account属性手动将AccountNode对象从XML节点转换为XML节点。使用XmlAnyElement标记属性可确保元素从XML中逐字记录:

public class Account
{
    public Account() { this.AccountNodes = new List<AccountNode>(); }

    [XmlIgnore]
    public List<AccountNode> AccountNodes { get; set; }

    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    [XmlAnyElement]
    public XElement[] AccountNodesXml
    {
        get
        {
            if (AccountNodes == null)
                return null;
            return AccountNodes.Select(a => new XElement((XName)a.Name, a.Value)).ToArray();
        }
        set
        {
            if (value != null)
                AccountNodes = value.Select(e => new AccountNode { Name = e.Name.LocalName, Value = (string)e }).ToList();
        }
    }
}

示例fiddle已成功反序列化并重新序列化以下XML:

<Account>
  <AccountNumber>12345</AccountNumber>
  <Balance>12.52</Balance>
  <LateFee>0</LateFee>
</Account>