7
votes

Xelement Ajouter Préfixe uniquement

J'ai un fichier XML comme: xxx

avec c # I Créez un nouvel élément comme: xxx

comme vous pouvez le voir N'ajoutez pas le préfixe "myPrefix". Quelqu'un peut-il me dire comment je peux faire ça? Je ne veux plus abandonner les xmlns. Merci, Peter


0 commentaires

3 Réponses :


4
votes

Modifier 1:
Si vous ajoutez l'attribut d'espace de noms ASWELL à l'élément, cela le forcera à ajouter le préfixe. Mais vous vous retrouvez toujours avec l'attribut XMLNS dans le nœud. Pour le supprimer, vous devrez probablement utiliser Xmlwriter.

Edit 2:

Pour obtenir le XML exact que vous souhaitez que vous devez créer l'élément racine ASWELL:

Edit 3:

D'ACCORD. J'ai trouvé un moyen d'obtenir ce que vous voulez sans xmlwriter: xxx

edit 4:

Apparemment, il y avait un moyen plus facile ... beaucoup plus facile ... Voir les autres réponses.


12 commentaires

Merci pour votre réponse, mais cela ne fonctionnera pas. Le résultat est comme:


@Peter: il apparaîtra de cette façon si l'élément est la racine. Ce n'est pas la racine, alors il sera préfixé si l'espace de noms est déclaré dans un ancêtre.


@Peter: C'est juste comment fonctionne le sérialisateur LINQ vers XML. Je ne sais pas si c'est même possible sans retourner et utiliser un xmlwriter .


@Jeff, hm ok merci. Peut-être que quelqu'un sait un moyen et j'essaierai Xmlwriter.


@Sani merci beaucoup! Cela fonctionne pour moi :) Maintenant, il suffit de supprimer les XMLNS.


@Peter: a fait une solution de contournement pour vous qui devrait fonctionner si le XML existant est ce qui est présenté ci-dessus. Sinon, vous pouvez modifier le code à votre goût.


@Sani: Merci pour votre exemple! J'ajoute xmltree au conteneur racine, donc je n'ai pas à créer la racine. J'ai seulement besoin de quelque chose pour supprimer les XMLNS.


Quelqu'un une suggestion comment je peux supprimer uniquement les deuxièmes XMLNS: myPrefix = ".."?


@Peter: seul moyen de le faire, que j'ai trouvé sans recourir à Xmlwriter, est de créer l'élément racine aswell que dans l'exemple ci-dessus.


@Sani: hm et comment puis-je le faire avec xmlwriter? Créer une racine n'est pas une option, car le XMLtree sera ajouté à un Xcontainer (avec déjà une racine).


@Peter: J'ai un exemple de travail pour vous maintenant ... sans Xmlwrtre ... :)


@Peter: Pendant que ma version fonctionne pour votre exemple, vous devez vraiment regarder les autres exemples qui sont plus corrects.



9
votes
    XElement container = XElement.Parse(xml);
    XNamespace myPrefix = container.GetNamespaceOfPrefix("myPrefix");

    XElement xmlTree = new XElement(myPrefix + "Item",     
                            new XAttribute("Name", item.Name), 
                            new XAttribute("Mode", item.Mode));

    container.Add(xmlTree);

0 commentaires

3
votes

Vous devez construire de nouveaux éléments dans l'espace de noms. En supposant que vous connaissez le préfixe de l'espace de noms souhaité dans l'échantillon XML, alors procédez comme suit:

    var xml = "<myPrefix:Catalog xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\" xmlns:myPrefix=\"clr-namespace:........\"><myPrefix:Item Name=\"Item1\" Mode=\"All\" /></myPrefix:Catalog>";

    XElement catalog = XElement.Parse(xml);

    XNamespace myP = catalog.GetNamespaceOfPrefix("myPrefix");

    catalog.Add(new XElement(myP + "Item", new XAttribute("Name", "foo"), new XAttribute("Mode", "bar")));


1 commentaires

Merci beaucoup pour cette belle solution.