2012-03-30 6 views
0

Die XML ich arbeite mit hat die folgende Struktur:C# ein Element basierend auf es Deserialisieren ist Name übergeordneten Knoten

<fixture_statistics> 
    <home_player_1 id="2306143" teamid="2"> 
    <element_1>Some Data</element_1> 
    <element_2>Some Data</element_2> 
    </home_player_1> 
    <home_player_2 id="2306144" teamid="2"> 
    <element_1>Some Data</element_1> 
    <element_2>Some Data</element_2> 
    </home_player_2> 
</fixture_statistics> 

den Code nun deserialisieren es normalerweise würde wie folgt aussehen:

[XmlRootAttribute("fixture_statistics", Namespace = "", IsNullable = false)] 
    public class FixtureRoot 
    { 
     [XmlElement("home_player_1")] 
     [XmlElement("home_player_2")] 
     public List<FixtureStats> fixtures { get; set; } 
    } 
    public class FixtureStats 
    { 
     public string element_1; 
     [XMLElement("element_2")] 
     public string elementTwo; 
    } 

Hier ist die Frage: Ich hätte gerne, dass die FixtureStats-Klasse eine "position" -Eigenschaft hat, die dem Elementnamen des Elternteils entspricht (also hätte das FixtureStat-Objekt, das home_player_1 entspricht, die Position = 1). Kann dies mit den eingebauten Serialisierungsattributen geschehen?

Wenn es nicht möglich ist, was ist die sauberste Problemumgehung? Denken Sie daran, dass jedes Dokument ungefähr 50 Spielerelemente mit jeweils ungefähr 50 Datenelementen für Kinder enthalten wird.

+0

Die Struktur dieses Xml-Dokuments ist schlecht entworfen. Können Sie es ändern, so dass die Suffixe fallen gelassen werden? Wenn nicht, dann gibt es 3 Möglichkeiten, um es zu handhaben: Ich kann das Dokument vor/nach der Serialisierung transformieren, indem ich Suffixe ablege/neu schaffe (Hinzufügen eines zusätzlichen Schrittes), IXmlSerializable Interface implementieren (das ist schmerzhaft), benutze Linq zu Xml, um die Serialisierung zu handhaben (wird nicht sehr allgemein sein, kann schnell groß werden) – Pawel

+0

Einverstanden. Das Format der XML-Datei liegt nicht unter meiner Kontrolle. Wenn daher nicht mit dem Format gearbeitet werden kann, ist ein Transformationsschritt erforderlich. – daveharnett

Antwort

0

Wäre das nützlich?

XDocument xDoc = XDocument.Load(.....); 
var result = 
    xDoc.Descendants("element_1") 
    .Select(n => new { Parent = n.Parent.Attribute("id").Value,Value = n.Value, }) 
    .ToArray(); 
0
 var xml = XElement.Load("XMLFile1.xml"); 

     int startIndex = 12; 
     List<FixtureStats> fixtures = 
      (from playerNode in xml.Elements() 
      select new FixtureStats 
      { 
       position = Int32.Parse(playerNode.Name.LocalName.Substring(startIndex)), 
       element_1 = playerNode.Element("element_1").Value, 
       element_2 = playerNode.Element("element_2").Value 
      }).ToList(); 

Sie haben die Position in den übergeordneten Elementnamen zu finden, wo der ganzzahlige Teil befindet. Im Fall von "home_player_1" ist es 12, aber Sie können in verschiedenen Fällen Standard-String-Methoden finden.