2010-06-28 5 views
0

J'ai un fichier xml (Sample.xml) qui a la structure suivanteXml Création de fichier en C# en utilisant Xml Pour Linq

<Root> 
    <Child ChildName="Ms_7"> 
      <MissingSiblings> 
       <Sibling SiblingName="47" /> 
      </MissingSiblings> 
    </Child> 
    <Child ChildName="Ms_8"> 
      <MissingSiblings> 
       <Sibling SiblingName="P2" /> 
      </MissingSiblings> 
    </Child> 
    <Child ChildName="Ms_9"> 
      <MissingSiblings> 
       <Sibling SiblingName="T2" /> 
      </MissingSiblings> 
    </Child> 
    <Child ChildName="Ms_10"> 
      <MissingSiblings> 
       <Sibling SiblingName="R3" /> 
      </MissingSiblings> 
    </Child> 
    <Child ChildName="Additional_SIB1"> 
      <AdditionalSiblings> 
       <Sibling SiblingName="92" /> 
       <Sibling SiblingName="93" /> 
      </AdditionalSiblings> 
     <MissingSiblings> 
       <Sibling SiblingName="S3" /> 
      </MissingSiblings> 
    </Child> 
    <Child ChildName="Additional_SIB2"> 
      <AdditionalSiblings> 
       <Sibling SiblingName="39" /> 
       <Sibling SiblingName="34" /> 
      </AdditionalSiblings> 
    </Child> 
</Root> 

i besoin de mettre à jour un autre fichier xml (result.xml) de l'échantillon fichier .xml. comme

<Root> 
    <Step Name="Step1" Date="06/12/2010" Value=""> 
     <Test Name="Ms_7" AdditionalSibling="" MissingSibling="47"/> 
     <Test Name="Ms_8" AdditionalSibling="" MissingSibling="P2"/> 
     <Test Name="Ms_9" AdditionalSibling="" MissingSibling="T2"/> 
     <Test Name="Ms_10" AdditionalSibling="" MissingSibling="R3"/> 
     <Test Name="SIB1" AdditionalSibling="92,93" MissingSibling="S3"/> 
     <Test Name="SIB2" AdditionalSibling="39,34" MissingSibling=""/> 
    </Step> 
</Root> 

Maintenant, je suis en utilisant comme:

1) itérer le contenu du fichier Sample.xml

2) Vérifier si le "ChildName" Contient "supplémentaires"

a) Retrait temporarly

3) Itère nœuds enfants

4) si plus d'un enfant une virgule annexant (,)

le code est le suivant:

 XmlDocument SampleDoc = new XmlDocument(); 
     XmlDocument ResultDoc = new XmlDocument(); 

     SampleDoc.Load(Application.StartupPath + "\\Sample.xml"); 
     ResultDoc.Load(Application.StartupPath + "\\Result.xml"); 
     XmlElement ResultRoot = ResultDoc.DocumentElement; 
     XmlElement RsNxt = (XmlElement)ResultDoc.SelectSingleNode("//Step[@Name='Step222']"); 
     if (RsNxt == null) 
      RsNxt=ResultDoc.CreateElement("Step"); 
     else 
      RsNxt.RemoveAll(); 
     RsNxt.SetAttribute("Name", "Step1"); 
     RsNxt.SetAttribute("Date", DateTime.Now.ToString()); 
     RsNxt.SetAttribute("Value", ""); 
     String l_strName = ""; 
     XmlNodeList ChildList = SampleDoc.SelectNodes("//Root/Child"); 
     if (ChildList.Count > 0) 
     { 
      foreach (XmlNode child in ChildList) 
      { 
       XmlElement ChildElement = (XmlElement)child; 
       l_strName = ChildElement.GetAttribute("ChildName"); 

       bool l_bvalue = l_strName.Contains("Additional"); 
       int l_ntemp = 0; 
       XmlNodeList l_List = null; 
       String l_strAdd = ""; 
       String l_strMissing = ""; 

       String l_strAdditional = l_strName; 
       if (l_bvalue == true) 
        l_strAdditional = l_strName.Substring(l_strName.IndexOf('_') + 1); 

       XmlElement Test = ResultDoc.CreateElement("Test"); 
       Test.SetAttribute("Name", l_strAdditional); 
       if (l_bvalue == false) 
       { 
        l_List = ChildElement.SelectNodes("//Child[@ChildName='" + l_strName + "']/MissingSiblings/Sibling"); 

        l_ntemp = 0; 
        String l_strMissingSibling = ""; 
        foreach (XmlNode l_missingS in l_List) 
        { 
         XmlElement Element = (XmlElement)l_missingS; 
         l_strMissingSibling = Element.GetAttribute("SiblingName"); 
         l_ntemp += 1; 
         if (l_ntemp == 1) 
          l_strMissing = l_strMissingSibling; 
         if (l_ntemp > 1) 
         { 
          l_strMissing += ',' + " "; 
          l_strMissing += l_strMissingSibling; 
         } 
        } 
       } 
       else 
       { 
        l_List = ChildElement.SelectNodes("//Child[@ChildName='" + l_strName +"']/AdditionalSiblings/Sibling"); 
        l_ntemp = 0; 
        String l_strAddSibling = ""; 
        foreach (XmlNode Additional in l_List) 
        { 
         XmlElement nodeElement = (XmlElement)Additional; 
         l_strAddSibling = nodeElement.GetAttribute("SiblingName"); 
         l_ntemp += 1; 
         if (l_ntemp == 1) 
          l_strAdd = l_strAddSibling; 
         if (l_ntemp > 1) 
         { 
          l_strAdd += ',' + " "; 
          l_strAdd += l_strAddSibling; 
         } 
        } 
       } 
       Test.SetAttribute("AdditionalSiblings", l_strAdd); 
       Test.SetAttribute("MissingSiblings", l_strMissing); 
       RsNxt.AppendChild(Test); 
      } 

     } 
     ResultRoot.AppendChild(RsNxt); 
     ResultDoc.Save(Application.StartupPath + "\\Result.xml"); 

est-il une autre façon de le faire comme Xml à LINQ approch?

Merci à l'avance

Répondre

1

Cela peut certainement être simplifiée en utilisant LINQ to XML. J'ai écrit un court exemple pour votre cas, vous devez ajouter quelques détails (comme manipuler des frères et soeurs disparus aussi), mais cela devrait vous donner une idée. Le XDocument doc doit contenir le fichier XML d'origine.

XDocument newDoc = new XDocument(new XElement("step")); 
foreach (XElement child in doc.Root.Elements()) 
{ 
    XElement entry = new XElement("Test"); 
    entry.SetAttributeValue("Name", child.Attribute("ChildName") 
             .Value.Replace("Additional_", "")); 

    if (child.Elements("AdditionalSiblings").Count() > 0) 
    { 
     entry.SetAttributeValue("AdditionalSibling", 
      child.Elements("AdditionalSiblings").Elements() 
               .Select(xe => xe.Attribute("SiblingName").Value) 
               .Aggregate((s1,s2) => s1+","+s2)); 
    } 
    else 
    { 
     entry.SetAttributeValue("AdditionalSibling", ""); 
    } 
    newDoc.Root.Add(entry); 

} 
+0

Merci ... Je dois enlever « supplémentaire » de « Additional_SIB1 », puis de créer le nœud enfant avec la valeur d'attribut « Name = « SIB1 » » –

+0

@Pramodh: ligne Édité 5. =) – Jens

+0

@ Jens: il lancera l'exception si le nom ne contient pas "Additional" –

Questions connexes