2016-12-22 15 views
0

XMLを使用するオブジェクトに逆シリアル化しようとしています。可能であれば、テンプレートを作成して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; } 
} 

、それが表示され、彼らは標準の名前付けスキーマを持っている必要があり、その後、あなたは名の値に割り当てる属性を持つことができます。私はそれを確認できませんでした。誰かが私が見つけられなかった、または知識があり、これが可能かどうかを確認できるリンクがある場合、私は知りたいと思います。

EDIT:

私は上記よりもはるかに大きい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

Accountクラスの代理[XmlAnyElement] public XElement[] AccountNodesXmlプロパティを使用して、AccountNodeオブジェクトを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(); 
     } 
    } 
} 

サンプルに成功し、デシリアライズし、次のXMLを再シリアライズfiddle:素晴らしいです

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

。私は、私が探しているもののうちの多くのものに対する答えから築き上げることを望んでいましたが、少し苦労しています。デシリアライズしようとしているより大きなXMLがあり、多くのレベルが含まれています。私は私の質問を更新し、何ができるか見る。私は本当にあなたの助けに感謝します! – Histerical

+0

私は、このルートに行ったり、ノードの名前を標準の名前に変更したり、名前属性を持っているだけでも価値があると思います。 – Histerical

関連する問題