2016-12-22 2 views
0

Ich versuche, ein XML zu einem Objekt deserialize zu verwenden. Wir haben Templates erstellt und möchten das XML möglichst unverändert beibehalten. Das Problem, das ich herausfinden möchte, ist, wie man innerhalb eines Standardknotens in der XML sucht und alle Unterknoten sind der gleiche Objekttyp, nur mit verschiedenen Knotennamen.XML deserialize zum gleichen Objekt verschiedene Elementnamen

Zum Beispiel:

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

Kontoebene ist immer in der Vorlage, aber alles unterhalb variabel ist. Gibt es eine Möglichkeit, alle Knoten innerhalb der Account-Ebene zu deserialisieren, um dasselbe Objekt zu sein?

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

Auf der Grundlage meiner Forschung scheint es, müssen sie ein Standard-Namensschema haben und dann können Sie ein Attribut mit dem Namen Wert zuweisen müssen. Ich konnte das nur nicht bestätigen. Wenn jemand einen Link hat, den ich nicht finden konnte, oder der kenntnisreich ist und bestätigen kann, ob dies eine Möglichkeit ist oder nicht, würde ich gerne wissen.

EDIT:

Ich habe eine viel größere xml als oben aufgeführt, so versuche ich, zu sehen, wie ich es deserialisieren kann.

<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> 

Also mit diesem, gehe ich davon aus ist es ähnlich, aber im Grunde ist die Kontonummer Knoten die Variable ein und alles darüber und darunter Standard ist.

Antwort

1

Sie können eine Ersatz-[XmlAnyElement] public XElement[] AccountNodesXml-Eigenschaft in Ihrer Account-Klasse verwenden, um Ihre AccountNode-Objekte manuell von und in XML-Knoten zu konvertieren. Markieren der Eigenschaft mit XmlAnyElement stellt sicher, dass die Elemente wörtlich aus der XML genommen wird:

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(); 
     } 
    } 
} 

Probe fiddle die erfolgreich deserialisiert und erneut serialisiert die folgende XML:

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

Das ist großartig. Ich hatte gehofft, dass ich von der Antwort auf mehr von dem, was wir suchen, bauen könnte, aber ich habe ein bisschen zu kämpfen. Ich habe ein viel größeres XML, das ich versuche zu deserialisieren und enthält viele Ebenen. Ich werde meine Frage aktualisieren und sehen, was getan werden kann. Ich schätze deine Hilfe sehr!! – Histerical

+0

Ich schätze, lohnt es sich, diese Route zu gehen oder nur die Namen der Knoten zu Standard-Namen zu ändern und ein Namensattribut zu haben. – Histerical