11
votes

Xmlreader - J'ai besoin de modifier un élément et de produire un nouveau

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.

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

Je voudrais pouvoir faire quelque chose comme - c'est pseudo-code! xxx


0 commentaires

5 Réponses :


1
votes

Vous ne pouvez pas le faire facilement avec xmlreader - au moins, non sans lire le document XML entier dans le lecteur, fitzing avec elle puis créer un nouveau xmlreader Du résultat. Qui défait beaucoup le point d'utiliser xmlreader , à savoir la possibilité de diffuser des documents volumineux.

Vous pouvez potentiellement dérive de xmlreader , 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.


4 commentaires

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 (Réfléchir à la sous-classe XMLTEXTREADER , sauf si vous avez envie de mettre en œuvre de nombreuses méthodes abstraites) est un défi intéressant.


@RoberTrossney N'utilisez plus xmltexterreader plus:

Je l'ai corrigé en utilisant le codage de la bande de conduite suivante

    public XmlReader FixUpReader(XmlReader reader)
    {
       reader.MoveToContent();

        string xml = reader.ReadOuterXml();

        string dslVersion = GetDSLVersion();
        string Id = GetID();

        string processedValue = string.Format("<ExampleElement dslVersion=\"{1}\" Id=\"{2}\" ", dslVersion, Id);
        xml = xml.Replace("<ExampleElement ", processedValue);
        MemoryStream ms = new MemoryStream(System.Text.Encoding.ASCII.GetBytes(xml));
        XmlReaderSettings settings = new XmlReaderSettings();

        XmlReader myReader = XmlReader.Create(ms);
        myReader.MoveToContent();
        return myReader;
    }


1 commentaires

Je ne serais pas si sûr que ça marche. Le lecteur que vous revenez ne sera pas capable de passer à l'élément après celui-ci, car cet élément (en fait, tout le reste du document XML que le lecteur d'origine était en traitement) n'est pas dans son flux de support.



1
votes

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);
}


0 commentaires

14
votes

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> xxx pré>

Ceci n'est pas aussi propre que celui qui dérive votre propre Xmlwriter, mais je trouve que c'est beaucoup plus facile. P> [modifier] strud> 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);
  }
}


0 commentaires

-2
votes
        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

0 commentaires