2009-05-14 9 views
0

Je suis débutant en XML et XPath en C#. Voici un exemple de mon XML doc:Mise à jour ou insertion d'un nœud dans un document XML

<root> 
    <folder1> 
    ... 
    <folderN> 
     ... 
     <nodeMustExist>... 
     <nodeToBeUpdated>some value</nodeToBeUpdated> 
    .... 
</root> 

Ce que je besoin est de mettre à jour la valeur de nodeToBeUdpated si le nœud existe ou ajouter ce noeud après la nodeMustExist si nodeToBeUpdated est pas là. Le prototype de la fonction est quelque chose comme ceci:

void UpdateNode(
        xmlDocument xml, 
        string nodeMustExist, 
        string nodeToBeUpdte, 
        string newVal 
       ) 
{ 
    /* 

    search for XMLNode with name = nodeToBeUpdate in xml 
    to XmlNodeToBeUpdated (XmlNode type?) 
    if (xmlNodeToBeUpdated != null) 
    { 
     xmlNodeToBeUpdated.value(?) = newVal; 
    } 
    else 
    { 
     search for nodeMustExist in xml to xmlNodeMustExist obj 
     if (xmlNodeMustExist != null) 
     { 
      add xmlNodeToBeUpdated as next node 
      xmlNodeToBeUpdte.value = newVal; 
     } 
    } 

    */ 
} 

Peut-être il y a d'autres façons meilleures et simplifiées de le faire. Aucun conseil? A propos, si nodeToBeUpdated apparaît plus d'une fois à d'autres endroits, je veux juste mettre à jour le premier.

+0

J'ai changé le format de signature de votre méthode pour me débarrasser du défilement horizontal. Je déteste le défilement horizontal. – Welbog

Répondre

1

Ceci est de mettre à jour tous les noeuds dans le dossier:

public void UpdateNodes(XmlDocument doc, string newVal) 
     { 
      XmlNodeList folderNodes = doc.SelectNodes("folder"); 

      if (folderNodes.Count > 0) 
      foreach (XmlNode folderNode in folderNodes) 
      { 
       XmlNode updateNode = folderNode.SelectSingleNode("nodeToBeUpdated"); 
       XmlNode mustExistNode = folderNode.SelectSingleNode("nodeMustExist"); ; 
       if (updateNode != null) 
       { 
        updateNode.InnerText = newVal; 
       } 
       else if (mustExistNode != null) 
       { 
        XmlNode node = folderNode.OwnerDocument.CreateNode(XmlNodeType.Element, "nodeToBeUpdated", null); 
        node.InnerText = newVal; 
        folderNode.AppendChild(node); 
       } 

      } 
     } 

Si vous souhaitez mettre à jour un nœud particulier, vous ne pouvez pas passer chaîne nodeToBeUpdte, mais vous devrez passer le XmlNode du XmlDocument. J'ai omis le passage de noms de nœuds dans la fonction car les noms de nœuds sont peu susceptibles de changer et peuvent être codés en dur. Cependant, vous pouvez les passer aux fonctions et utiliser les chaînes à la place des noms de nœuds codés en dur.

0

Jetez un oeil à la méthode SelectSingleNode MSDN Doc

votre XPath veut être quelque chose comme "// YourNodeNameHere";

une fois que vous avez trouvé ce nœud, vous pouvez alors parcourir de nouveau l'arbre pour arriver au noeud « nodeMustExist »:

XmlNode nodeMustExistNode = yourNode.Parent["nodeMustExist]; 
1

L'expression XPath qui sélectionne toutes les instances de <nodeToBeUpdated> serait ceci:

/root/folder[nodeMustExist]/nodeToBeUpdated

ou, sous une forme plus générique:

/root/folder[*[name() = 'nodeMustExist']]/*[name() = 'nodeToBeUpdated']

adapté pour:

void UpdateNode(xmlDocument xml, 
       string nodeMustExist, 
       string nodeToBeUpdte, 
       string newVal) 
{ 
    string xPath = "/root/folder[*[name() = '{0}']]/*[name() = '{1}']"; 
    xPath = String.Format(xPath, nodeMustExist, nodeToBeUpdte); 

    foreach (XmlNode n in xml.SelectNodes(xPath)) 
    { 
    n.Value = newVal; 
    } 
} 
Questions connexes