2011-09-15 1 views
1

Salut j'ai le code suivant pour lire le fichier xml et modifier la valeur du nœud particulier, mais je veux faire la même chose en utilisant XmlTextReader ou xmlreader, j'essaie d'éviter l'instruction doc.Save(System.Web.HttpContext.Current.Server.MapPath("Data/Example.xml"));, qui a une référence directe à mon fichier physique.Comment analyser et mettre à jour le fichier XML à l'aide XmlTextReader ou xmlreader

XmlDocument doc = new XmlDocument(); 
        string xmlFile = System.Web.HttpContext.Current.Server.MapPath("Data/Example.xml"); 
        doc.Load(xmlFile); 
        XmlNodeList xmlnode = doc.GetElementsByTagName("value"); 
        xmlnode[0].ChildNodes[0].Value = 23; 
doc.Save(System.Web.HttpContext.Current.Server.MapPath("Data/Example.xml")); 
+0

+1 mais question de toute façon semble unconcius, il est impossible de * sauver * quoi que ce soit en utilisant * lecteur *, est me rappelle une mauvaise connaissance de la langue anglaise de la mienne. –

Répondre

2

Bien Quelquechose de va devoir avoir une référence au fichier. Cependant, vous pouvez facilement changer votre code simplement accepter un Stream (qui devrait être lisible, inscriptible et adressable):

private static void ChangeDocument(Stream stream) 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.Load(stream); 
    XmlNodeList xmlnode = doc.GetElementsByTagName("value"); 
    xmlnode[0].ChildNodes[0].Value = 23; 
    stream.Position = 0; 
    doc.Save(stream); 
    stream.SetLength(stream.Position); // Truncate the file if it was longer 
} 

Il est un peu laid, il est vrai ...

Bien sûr, vous pouvez toujours passe dans le nom du fichier lui-même - votre appel MapPath serait encore dans une méthode de niveau plus élevé, qui peut être tout ce que vous essayez d'atteindre:

private static void ChangeDocument(string filename) 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.Load(filename); 
    XmlNodeList xmlnode = doc.GetElementsByTagName("value"); 
    xmlnode[0].ChildNodes[0].Value = 23; 
    doc.Save(filename); 
} 

une dernière remarque - si vous utilisez .NET 3.5 ou supérieur , Je te recommande fortement LINQ to XML comme une API XML plutôt plus agréable.

+0

Tricky façon de cacher doc.Save (...)? –

+0

chemin Puis complet à un fichier sera dans un autre code où vous déclarez objet Stream, de toute façon, il est tout simplement inévitable en utilisant l'approche basée sur les fichiers –

+0

@Artur: Oui, si vous souhaitez accéder à un fichier, vous allez avoir besoin du nom être connu * quelque part *. J'ai supposé que le PO ne voulait pas qu'il soit calculé * ici *, ce qui pourrait bien être tout à fait raisonnable. (Par exemple, ce code pourrait être mis dans une bibliothèque de classes utilisés dans plusieurs applications, où 'Server.MapPath' pourrait bien être inappropriée.) –

1

Vous ne pouvez pas écrire ou données XML de mise à jour à l'aide XmlTextReader ou XmlReader ansectors, utilisez XmlTextWriter ou XmlWriter ancêtres, ot XmlSerializer.Serialize (..) Méthode comme alternative.

Vous ne pouvez pas éviter la déclaration et aussi bien,

doc.Save(System.Web.HttpContext.Current.Server.MapPath("Data/Example.xml")); 

qui a une référence directe à votre fichier physique, parce que vous devez écrire les nœuds modifiés dans le fichier d'origine à nouveau, Otherwize vous devez passer votre système n'utilise pas l'approche basée sur les fichiers (site Web ASP.NET utilisant le stockage de données basé sur des fichiers) mais l'approche basée sur la base de données (site Web ASP.NET utilisant le serveur de base de données).

Comme solution de rechange, utilisez vos propres données XML dans votre serveur SQL, puis charger et mettre à jour à l'aide d'EF ORM.

Questions connexes