2010-10-17 8 views
0

J'ai un XML comme suit.Mise à jour de l'attribut enfant d'un XElement (ou d'un XElement cloné)

<AFConfig> 
<Geographies> 
    <Geography id="Place1" description="NicePlace"> 
    <MetaData> 
    <Services> 
    <Service> 
    ... 
    ... 
    </Service> 
    </Services> 
    </MetaData> 
    <Systems> 
    <DefaultSystem systemName="SYSONE" server=http"//192.168.0.0" /> 
    </Systems> 
    </Geography> 
<Geographies> 
</AFConfig> 

Ce que je veux faire est ceci.

  1. Clone l'élément Géographie et l'ajouter comme Sibling (c.-à-enfant à Géographies)
  2. Mise à jour "id", "description" avec de nouvelles valeurs ET
  3. mise à jour du SystemName avec la nouvelle valeur

Mon code.

XDocument xd_Document = XDocument.Load(s_FileName); 
XElement xe_Element = (from xe in xd_Document.XPathSelectElements(s_Element) 
         where xe.Attribute(s_IdAttr).Value == s_Value 
         select xe).SingleOrDefault(); 
XElement xe_NewElement = CloneElement(xe_Element) 
foreach(KeyValuePair<string, string> s in d_AttrValue) 
    xe_NewElement.Attribute(s.Key).Value = d_AttrValue[s.Key]; 
xe_Element.Parent.Add(xe_NewElement); 
xd_Document.Save(s_destFileName); 

Je passe à cette méthode, les paramètres suivants chaîne s_FileName, s_destFileName chaîne, s_Element chaîne, chaîne s_IdAttr, chaîne s_Value, Dictionnaire d_AttrValue

Avec ce code, je suis en mesure de modifier l'identifiant et la description les attributs.

Question: Comment vais-je modifier l'attribut DefaultSystem systemName avec une valeur? NB: J'ai le même code pour la modification de l'élément existant sans la création du nouvel élément. Encore une fois, je rencontre le même problème. Une solution générique serait préférée.

Répondre

0
xe_NewElement.Element("Systems") 
    .Element("DefaultSystem") 
    .Attribute("systemName") 
    .Value = "Enter your value here"; 

Je crois que je devrais faire ce dont vous avez besoin.

EDIT:

var attribute = ((IEnumerable)xe_NewElement.XPathEvaluate("Systems/DefaultSystem/@systemName")) 
    .Cast<XAttribute>().FirstOrDefault(); 

attribute.Value = "Entrez votre valeur ici";

Vous devriez le permettre de manière générique en passant une liste de xpaths et de valeurs.

+0

Andy: Merci. Mais, mon code fait partie d'une fonction. Et je préférerais ne pas coder en dur les noms des éléments enfants. Existe-t-il un moyen générique de résoudre ce problème? – Kanini

+0

J'ai modifié ma réponse pour inclure une solution plus générique. Bien que ce ne soit pas joli, il doit y avoir une meilleure solution. –

+0

Andy: Le morceau de code édité ci-dessus vient avec une erreur de Utiliser le type générique 'System.Collections.Generic.IEnumerable ' requiert des arguments de type '1' – Kanini