我正在尝试将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,它上面和下面的所有内容都是标准的。
答案 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>