将子节点Linq保存为XML

时间:2009-08-19 13:49:46

标签: c# linq-to-xml

这是一个真正的新手问题,但我正在努力让这个工作。我试图将一些数据保存到XML文件中,但我无法弄清楚将元素放在正确位置的语法。

我希望能够根据工厂和公司之间的关联来保存我在相应部分中构建的xml树。代码始终将数据添加到第一部分。我觉得我需要在_xmlEntity.Element(“Company”)中使用where子句的时间.Element(“Plants”)。添加代码部分,但我现在还不太了解linq以使其工作。

在我还在学习的时候,请随意评论您在此代码中看到的任何其他问题。

这是我的(按比例缩小)xml结构。

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

我正在使用此代码构建xml并将其添加到结构中。

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

1 个答案:

答案 0 :(得分:1)

我能够让它工作,所以我想我会发布我使用的代码。可悲的是,我不确定为什么会这样,我只是盲目地绊倒它直到它按照我预期的方式工作。我很乐意接受其他建议,甚至解释为什么这样做。我不明白的是变量_xmlEntity如何使用_xmlPlantData的结果进行更新。我觉得编写的代码我不明白是非常愚蠢的。

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

}