более эффективный подход к созданию XML с использованием Linq - PullRequest
1 голос
/ 19 мая 2011

Я создаю xml, беря skelton xml и заполняя узлы значениями, и при необходимости добавляя новые узлы между xml. Я поступаю следующим образом и чувствую себя ... неэффективно. Есть ли лучший способ выполнить мое требование?

Образец простого продукта Xml:

<root>
  <ProductInformation>
    <Name></Name>
    <ProductId></ProductId>
    <Description></Description>
    <Details>
      <TabName></TabName>
      <DetailList>
        <Add>
          <Type></Type>
          <Information></Information>
        </Add>
      </DetailList>
    </Details>
  </ProductInformation>
</root>

Код:

XDocument xmlDoc = XDocument.Load(Server.MapPath("/PlainProduct.xml"));
        xmlDoc.Element("root").Element("ProductInformation").SetElementValue("Name","iPhone");
        xmlDoc.Element("root").Element("ProductInformation").SetElementValue("ProductId", "123456");
        foreach (XElement detail in xmlDoc.Descendants("ProductInformation").Elements("Details"))
        {
            detail.SetElementValue("TabName", "Specifications");
            foreach (XElement x in detail.Elements("DetailList"))
            {
                //Update node value and here the node already exists in plain skelton xml
                x.Element("Add").SetElementValue("Type","Plastic");
                x.Element("Add").SetElementValue("Information", "24 Carat");
                //Added below two new nodes dynamically if my backend has more items of details programmatically
                x.Add(new XElement("Add",
                          new XElement("Type", "Fabric"),
                          new XElement("Information", "Smooth")));
                x.Add(new XElement("Add",
                         new XElement("Type", "Finishes"),
                         new XElement("Information", "Rogh")));
            }
        }

1 Ответ

2 голосов
/ 19 мая 2011

Если под «эффективным» вы подразумеваете «проще в обслуживании», вы можете попробовать эту технику:

    static void SetItem(string XMLInformation, string newText, XElement document)
    {
        ((XElement)document.DescendantNodes().Last(x => 
               x.NodeType == System.Xml.XmlNodeType.Element
                 && ((XElement)x).Name == XMLInformation)).SetValue(newText);
    }

    static void SetElementItem(string XMLInformation, string elementItem, string newText, XElement document)
    {
        ((XElement)document.DescendantNodes().Last(x => 
               x.NodeType == System.Xml.XmlNodeType.Element
                 && ((XElement)x).Name == XMLInformation)).SetElementValue(elementItem, newText);
    }

    static void AddNewElement(string XMLInformation, string elementItem, XElement document)
    {
        ((XElement)document.DescendantNodes().Last(x => 
               x.NodeType == System.Xml.XmlNodeType.Element
                 && ((XElement)x).Name == XMLInformation)).Add(new XElement(elementItem);
    }

... и тогда вы сделаете это

        var xmlDoc = XElement.Load("XmlFile.xml");
        SetItem("Name", "iPod", xmlDoc);
        SetItem("ProductId", "123456", xmlDoc);
        SetElementItem("Add", "Type", "Plastic", xmlDoc);
        SetElementItem("Add", "Information", "24 Carat", xmlDoc);

        //loop as needed
        AddNewElement("DetailList", "Add", xmlDoc);
        SetElementItem("Add", "Type", "Fabric", xmlDoc);
        SetElementItem("Add", "Information", "Rogh", xmlDoc);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...