2010-09-02 9 views
1

J'ai trouvé quelques exemples à ce sujet. Certains des exemples gived une méthode pour modifier l'attribut avec SelectNodes() ou SelectSingleNode(), et d'autres gived la méthode pour modifier l'attribut avec someElement.SetAttribute("attribute-name", "new value");Modification du contenu XML existant en C#

Mais je ne comprends toujours pas que la façon de construire la relation si je seulement XpathNodeItterator it?

Je Supposé défini comme ci-dessous,

System.Xml.XPath.XPathDocument doc = new XPathDocument(xmlFile); 
System.Xml.XPath.XPathNavigator nav = doc.CreateNavigator(); 
System.Xml.XPath.XPathNodeIterator it; 

it = nav.Select("/Equipment/Items/SubItmes"); 
while (it.MoveNext()) 
{ 
    name = it.Current.GetAttribute("name ", it.Current.NamespaceURI); 
    int vidFromXML = int.Parse(it.Current.GetAttribute("vid", it.Current.NamespaceURI)); 
    if (vidFromXML = vid) 
    { 
    // How can I find the relation between it and element and node? I want to modify name attribute value. 
    } 
} 

Y at-il une méthode comme it.setAttribute(name, "newValue")?

Répondre

4

De MSDN: « Un objet XPathNavigator est créé à partir d'une classe qui implémente l'interface IXPathNavigable tels que les classes XPathDocument et XmlDocument objets XPathNavigator créé par des objets XPathDocument sont en lecture seule alors que les objets XPathNavigator créés par des objets XmlDocument peut être. Le statut en lecture seule ou modifiable d'un objet XPathNavigator est déterminé à l'aide de la propriété CanEdit de la classe XPathNavigator. " Donc, tout d'abord, vous devez utiliser XmlDocument, pas XPathDocument, si vous voulez définir un attribut.

Un exemple de la façon de modifier des données XML à l'aide d'un XPathNavigator à l'aide de la méthode CreateNavigator d'un XmlDocument est affiché here.

Comme vous le verrez dans l'exemple, il existe une méthode SetValue sur votre objet it.Current.

Voilà comment vous le feriez pour votre code, avec quelques légères modifications:

 int vid = 2; 
     var doc = new XmlDocument(); 
     doc.LoadXml("<Equipment><Items><SubItems vid=\"1\" name=\"Foo\"/><SubItems vid=\"2\" name=\"Bar\"/></Items></Equipment>"); 
     var nav = doc.CreateNavigator(); 

     foreach (XPathNavigator it in nav.Select("/Equipment/Items/SubItems")) 
     { 
      if(it.MoveToAttribute("vid", it.NamespaceURI)) { 
       int vidFromXML = int.Parse(it.Value);      
       if (vidFromXML == vid) 
       { 
        // if(it.MoveToNextAttribute() ... or be more explicit like the following: 

        if (it.MoveToParent() && it.MoveToAttribute("name", it.NamespaceURI)) 
        { 
         it.SetValue("Two"); 
        } else { 
         throw new XmlException("The name attribute was not found."); 
        }     
       } 
      } else { 
        throw new XmlException("The vid attribute was not found."); 
      } 
     } 
+0

Merci pour vos commentaires . J'ai étudié le tutoriel MSDN. J'ai trouvé que la méthode de 'SetValue' était utilisée pour mettre à jour la valeur de l'élément, pas la valeur de l'attribut. Peut essayé mais échoué. Je dois trouver un moyen de mettre à jour la valeur de l'attribut. –

+0

J'ai trouvé votre mise à jour de détail maintenant. Introduit 'it.MoveToAttribute()'. Je vais l'essayer maintenant. Je vous remercie. –

+0

Il n'y a pas de 'var' dans .NET 2.0. Je ne peux pas utiliser 'int.Parse (name)' quand je passe une valeur de type chaîne à 'name'. Jeter ** La chaîne d'entrée n'était pas dans un format correct. **. Comment puis-je le réparer? –

0

j'ai écrit une méthode d'extension qui fournit une méthode SetAttribute pour tout XPathNavigator:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.XPath; 

namespace My.Shared.Utilities { 
    public static class XmlExtensions { 
     public static void SetAttribute(this XPathNavigator nav, string localName, string namespaceURI, string value) { 
      if (!nav.MoveToAttribute(localName, namespaceURI)) { 
       throw new XmlException("Couldn't find attribute '" + localName + "'."); 
      } 
      nav.SetValue(value); 
      nav.MoveToParent(); 
     } 
    } 
} 
Questions connexes