Je remplace une méthode qui a une méthode XMLReader, j'ai besoin de trouver un élément spécifique, d'ajouter un attribut, puis de créer une nouvelle xmlreader ou de remplacer simplement l'existant avec le contenu modifié. J'utilise C # 4.0
J'ai enquêté sur XElement (LINQ), mais je ne peux pas sembler manipuler un élément existant et ajouter un attribut et une valeur. P>
Je sais que le XMLwriter a écrasé. serait fantastique mais encore une fois, je ne suis pas sûr de savoir comment tout va ensemble P>
Je voudrais pouvoir faire quelque chose comme - c'est pseudo-code! p>
5 Réponses :
Vous ne pouvez pas le faire facilement avec Vous pouvez potentiellement em> dérive de xmlreader code> - au moins, non sans lire le document XML entier dans le lecteur, fitzing avec elle puis créer un nouveau
xmlreader code > Du résultat. Qui défait beaucoup le point d'utiliser
xmlreader code>, à savoir la possibilité de diffuser des documents volumineux. P>
xmlreader code>, transférer la plupart des appels de méthode au lecteur existant, mais les interceptant le cas échéant pour ajouter des attributs supplémentaires, etc. mais je soupçonne que le code serait vraiment assez complexe et fragile. p>
Merci pour la réponse, j'ai pensé (espéré) Ce serait une bonne opération simple. Je ne peux pas être la seule personne qui ait jamais voulu lire en XML jusqu'à un certain élément, le modifier, puis générer le résultat modifié. - Si vous entendez plus de jurons que d'habitude en lecture aujourd'hui ... c'est moi !!
@Phill: Il est facile de le faire, mais pas de manière en streaming, je crains :(
Sous-classement XMLReader Code> (Réfléchir à la sous-classe
XMLTEXTREADER CODE>, sauf si vous avez envie de mettre en œuvre de nombreuses méthodes abstraites) est un défi intéressant.
Je préférerais préférer charger le XML dans xmldocument code> objet et utiliser
attributs code> pour modifier la valeur et l'appel
Enregistrer la méthode pour mettre à jour cette page. valeur. Sous le code fonctionne pour moi.
public static void WriteElementValue ( string sName, string element, string value)
{
try
{
var node = String.Format("//elements/element[@name='{0}']", sName);
var doc = new XmlDocument { PreserveWhitespace = true };
doc.Load(configurationFileName);
var nodeObject = doc.SelectSingleNode(node);
if (nodeObject == null)
throw new XmlException(String.Format("{0} path does not found any matching
node", node));
var elementObject = nodeObject[element];
if (elementObject != null)
{
elementObject.Attributes["value"].Value = value;
}
doc.Save(configurationFileName);
}
catch (Exception ex)
{
throw new ExitLevelException(ex, false);
}
xmlreader / écrivain sont des flux d'accès séquentiels. Vous devrez lire à une extrémité, traiter le flux comment vous voulez et écrivez-le à l'autre extrémité. L'avantage est que vous n'avez pas besoin de lire le tout en mémoire et de construire un DOM, ce que vous obtiendrez avec une approche xmldocument.
Cette méthode devrait vous aider à démarrer: p> Ceci n'est pas aussi propre que celui qui dérive votre propre Xmlwriter, mais je trouve que c'est beaucoup plus facile. P> Un exemple de la façon dont vous ouvriez deux flux à la fois pourraient être quelque chose comme ceci: P> using (FileStream readStream = new FileStream(@"c:\myFile.xml", FileMode.OpenOrCreate, FileAccess.Read, FileShare.Write)) {
using (FileStream writeStream = new FileStream(@"c:\myFile.xml", FileMode.OpenOrCreate, FileAccess.Write)) {
PostProcess(readStream, writeStream);
}
}
string newvalue = "10"; string presentvalue = ""; string newstr = ""; XmlReader xmlr = XmlReader.Create(new StringReader(str)); while (xmlr.Read()) { if (xmlr.NodeType == XmlNodeType.Element) { if (xmlr.Name == "priority") { presentvalue = xmlr.ReadElementContentAsString(); newstr = str.Replace(presentvalue, newvalue); } } } //newstr can be written back to file... that is the edited xml