2009-08-19 19 views
0

Dies ist eine echte Newbie Frage, aber ich habe Mühe, dies zur Arbeit zu bringen. Ich versuche, einige Daten in einer XML-Datei zu speichern, aber ich kann die Syntax, die erforderlich ist, um die Elemente an dem richtigen Speicherort zu platzieren, nicht herausfinden.Speichern von Child Nodes Linq zu XML

Ich möchte in der Lage sein, den XML-Baum zu speichern, den ich in den entsprechenden Abschnitten basierend auf einer Zuordnung zwischen dem Werk und dem Unternehmen erstellt habe. Der Code wie immer fügt die Daten dem ersten Abschnitt hinzu. Ich habe das Gefühl, ich brauche etwas Zeit von Where-Klausel in der _xmlEntity.Element ("Firma"). Element ("Pflanzen"). Add Abschnitt des Codes, aber ich verstehe Linq jetzt nicht gut genug, um es zur Arbeit zu bringen.

Fühlen Sie sich frei, irgendwelche anderen Probleme zu kommentieren, die Sie mit diesem Code sehen können, während ich noch lerne.

Dies ist meine (verkleinerte) XML-Struktur.

<?xml version="1.0" encoding="utf-8"?> 
<Entities> 
    <Company> 
    <Name>Company A</Name> 
    <Phone>(555) 516-5165</Phone> 
    <Plants> 
    <Plant> 
     <Name>Plant A</Name> 
     <EfficiencyRate>92</EfficiencyRate> 
    </Plant> 
    <Plant> 
     <Name>Plant B</Name> 
     <EfficiencyRate>92</EfficiencyRate> 
    </Plant> 
    </Plants> 
    </Company> 
    <Company> 
    <Name>Test Company</Name> 
    <Phone>(555) 123-1234</Phone> 
    <Plants /> 
    </Company> 
</Entities> 

Ich verwende diesen Code, um das XML zu erstellen und es der Struktur hinzuzufügen.

//Method to save plant information to XML file 
    public bool SavePlant(Plant plantData) 
    { 
     DataAcccess _newDataAccess = new DataAcccess(); 
     XElement _xmlEntity = _newDataAccess.LoadXMLFile("EntityData"); 

     //Validation code removed to make example smaller... 

     //Create xml tree for new plant entry 
     _xmlEntity.Element("Company").Element("Plants").Add(new XElement("Plant", 
      new XElement("Name", plantData.Name), 
      new XElement("Address", plantData.Address), 
      new XElement("City", plantData.City), 
      new XElement("State", plantData.State), 
      new XElement("Zip", plantData.Zip), 
      new XElement("Phone", plantData.Phone), 
      new XElement("WorkDays", plantData.WorkDays), 
      new XElement("WorkHours", plantData.WorkHours), 
      new XElement("EfficiencyRate", plantData.EfficiencyRate))); 

     //Save the tree in the EntityData.xml file and return a bool for the results 
     return _newDataAccess.SaveXMLData("EntityData", _xmlEntity); 
    } 

Antwort

1

Nun, ich war in der Lage, dies zu arbeiten, also dachte ich, ich würde den Code, den ich verwendet habe, posten. Leider bin ich nicht sicher, warum das funktioniert, ich bin einfach blindlings durchgestolpert, bis es so funktioniert, wie ich es erwartet hatte. Ich nehme gerne andere Vorschläge oder auch eine Erklärung, warum das funktioniert. Was ich nicht verstehe ist, wie die Variable _xmlEntity jemals mit den Ergebnissen von _xmlPlantData aktualisiert wird. Ich fühle mich ziemlich dumm, Code zu haben, den ich geschrieben habe, den ich nicht verstehe.

public bool SavePlant(Plant plantData) 
    { 
     DataAcccess _newDataAccess = new DataAcccess(); 
     XElement _xmlEntity = _newDataAccess.LoadXMLFile("EntityData"); 

     //Validation code removed to make example easier to follow. 

     XElement _xmlPlantData = new XElement ("Plant", 
      new XElement("Name", plantData.Name), 
      new XElement("Address", plantData.Address), 
      new XElement("City", plantData.City), 
      new XElement("State", plantData.State), 
      new XElement("Zip", plantData.Zip), 
      new XElement("Phone", plantData.Phone), 
      new XElement("WorkDays", plantData.WorkDays), 
      new XElement("WorkHours", plantData.WorkHours), 
      new XElement("EfficiencyRate", plantData.EfficiencyRate)); 


     XElement _xmlTemp = _xmlEntity.Descendants("Company").First(el => (string)el.Element("Name").Value == plantData.ParentCompany); 
     _xmlTemp.Element("Plants").Add(_xmlPlantData); 

     //Save the tree in the EntityData.xml file and return a bool for the results 
     return _newDataAccess.SaveXMLData("EntityData", _xmlEntity); 
    } 

} 
+0

Was verstehst du nicht? _xmlEntity enthält Ihr XML-Dokument. Der Code, der _xmlTemp festlegt, findet ein Element in diesem Dokument. Dann fügen Sie _xmlPlantData als Kind dieses Elements hinzu. Dieses Element befindet sich immer noch in Ihrem XML-Dokument und aktualisiert Ihr Dokument. –

+0

Ich glaube, ich habe nicht verstanden, warum die Aktualisierung von _xmlTemp automatisch _xmlEntity aktualisiert. Danke, dass du mir das erklärt hast. –