Supprimer des attributs de XElement
Je suis en train de supprimer certains attributs de document xml. Voici ce que j'ai essayé:
private void RemoveEmptyNamespace(XElement element) {
foreach (XElement el in element.Elements()) {
if (el.Attribute("xmlns") != null && el.Attribute("xmlns").Value == string.Empty)
el.Attribute("xmlns").Remove();
if (el.HasElements)
RemoveEmptyNamespace(el);
}
}
Mais ça ne fonctionne pas. Quand je debug à l'intérieur de la méthode, attribut est supprimé, mais lorsque la méthode est exécutée entièrement, aucun changement n'a été enregistré. Le document est le même. Je suppose que c'est à cause de la boucle foreach, mais je ne vois pas d'autre moyen de la boucle à travers.
Toutes les suggestions sont les bienvenues.
EDIT: Voici le code entier je suis en utilisant:
var file = new FileStream(destinationPath, FileMode.Open);
var doc = new XDocument();
doc = XDocument.Load(savedFile);
RemoveEmptyNamespace(doc.Root);//method above
file.SetLength(0);
doc.Save(file);
file.Close();
EDIT2: Maintenant, j'ai essayé d'atteindre le même but par aller ligne par ligne et le remplacement de chaînes de caractères. Et rien ne se passe!!! Le document est toujours le même. Si quelqu'un a eu le même problème, merci de m'aider.
Holterman Pas sauvé signifie que le document est le même qu'il était avant l'appel de la méthode, comme je l'ai décrit dans la question.
Le problème est dans l'épargne que, pas dans la méthode que vous avez décrit. Utilisez simplement doc.Enregistrer(nom de fichier) à la place. fichier.SetLengh - pour quoi faire?
Holterman Mon xml est .fichier csproj, mais qui ne devrait pas d'importance. Je suis vraiment confus.
Je suis à la longueur de réglage à 0 parce que je ne veux pas ajouter du texte à un document existant, mais pour éliminer en premier. Je suis à l'aide de la doc.Enregistrer...
OriginalL'auteur Vale | 2011-07-06
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé ce que fait le problème. XDocument classe a été l'ajout de vide xmlns chaque fois que j'ai changé quelque chose dans le document! C'est pourquoi je n'arrivais pas à les supprimer. Il se comporte comme ça parce qu'il a besoin d'espace de noms pour chaque définition de XElement que vous créez. Donc, j'ai résolu le problème en le faisant. La seule chose qui doit être fait est d'ajouter de l'espace de noms de la XElement nom. Quelque chose comme ceci:
J'espère que cela aidera quelqu'un avec le même problème. Merci à tous pour vos réponses.
Je travaillais avec cela il y a longtemps, mais je pense que l'espace de noms doit séjourner si vous êtes à la sérialisation des éléments wpf par exemple (qui est ce que je faisais ici) ou si vous faites quelque chose de similaire. Si vous êtes à la création de XDocument à la main à partir de zéro, aucun espace de noms n'est pas nécessaire (à partir de mon activité).
merci pour l'astuce. Votre solution a résolu mon problème. Cheers 🙂
OriginalL'auteur Vale
Ce travail pour moi:
Seule différence est que je compte avec l'attribut xmlns dans l'élément racine trop.
Mais il fonctionne vraiment, faites-moi confiance
ensemble du test:
OriginalL'auteur Ales Ruzicka
retour de la XElement à partir de la méthode et de l'affecter de retour dans la variable, ou passer comme référence
OriginalL'auteur hungryMind
OriginalL'auteur Jaydeep Shil
Le problème, c'est que vous supprimez l'attribut en lecture seule de l'objet créé dans le "foreach" en boucle. Vous devez supprimer l'instance de l'enfant de "les éléments", pas de "el".
Je pense qu'un meilleur et la solution la plus simple est l'utilisation d'un "pour" pour cette tâche. en C# peut-être quelque chose comme ça:
Espère que cette aide.
EDIT: ne pas créer un nouvel objet, créer un en lecture seule de l'objet, mais il fait référence à l'interaction de l'objet.
Je ne peux pas accéder XElement par des index, seulement par le nom. Votre exemple est pour le XNode je pense.
Selon le langage de spécification 8.8.4 msdn.microsoft.com/en-us/library/aa664754%28v=vs.71%29.aspx "La variable d'itération correspond à une lecture seule variable locale avec une portée qui s'étend sur l'embedded déclaration." donc, oui, est la référence, mais vous ne pouvez pas le modifier.
OriginalL'auteur Neonamu