Linq To Xml, deux fois le même Namespace dans une seule balise

Résolu
Whismeril Messages postés 17806 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 septembre 2022 - 12 mars 2014 à 15:15
Whismeril Messages postés 17806 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 septembre 2022 - 21 mars 2014 à 10:10
Bonjour,

je cherche à ecrire un xml au format Excel 2003 avec Linq To Xml, FrameWork 3.5.

le début du fichier doit être
<?xml version="1.0" encoding="utf-16"?>
<?mso-application progid='Excel.Sheet'?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:s="urn:schemas-microsoft-com:office:spreadsheet">


Dans la balise workbook il y a deux fois le Namespace urn:schemas-microsoft-com:office:spreadsheet, sans alias (xmlns=) et avec (xmlns:s).

Je n'arriave pas à le faire avec Linq to xml.


Ce code
            XNamespace s = "urn:schemas-microsoft-com:office:spreadsheet";
            XNamespace x = "urn:schemas-microsoft-com:office:excel";

            XDocument xDoc = new XDocument(
                new XProcessingInstruction("mso-application", "progid='Excel.Sheet'"),
                            new XElement(s+"Workbook",
                                new XElement("Toto", "Toto")));//juste pour avoir quelque chose dans la balise

            xDoc.Save("test.xml");

génère la balise sans alias
<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid='Excel.Sheet'?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet">
  <Toto xmlns="">Toto</Toto>
</Workbook>



Celui-ci
            XNamespace s = "urn:schemas-microsoft-com:office:spreadsheet";
            XNamespace x = "urn:schemas-microsoft-com:office:excel";

            XDocument xDoc = new XDocument(
                new XProcessingInstruction("mso-application", "progid='Excel.Sheet'"),
                            new XElement(s+"Workbook", new XAttribute(XNamespace.Xmlns + "x","urn:schemas-microsoft-com:office:excel") ,new XAttribute(XNamespace.Xmlns + "s", "urn:schemas-microsoft-com:office:spreadsheet"),
                                new XElement("Toto", "Toto")));//juste pour aoir quelque chose dans la balise

            xDoc.Save("test.xml");

ecrit le xml, avec les deux alias et "s": devant workbook:
<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid='Excel.Sheet'?>
<s:Workbook xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:s="urn:schemas-microsoft-com:office:spreadsheet">
  <Toto>Toto</Toto>
</s:Workbook>


Et ceux-là beuguent ou ne compilent pas.
                            new XElement("Workbook",new XAttribute(XNamespace.Xmlns, "urn:schemas-microsoft-com:office:spreadsheet"), new XAttribute(XNamespace.Xmlns + "x","urn:schemas-microsoft-com:office:excel") ,new XAttribute(XNamespace.Xmlns + "s", "urn:schemas-microsoft-com:office:spreadsheet")//ne compile pas 

                            new XElement("Workbook",new XAttribute(XNamespace.Xmlns + "", "urn:schemas-microsoft-com:office:spreadsheet"), new XAttribute(XNamespace.Xmlns + "x","urn:schemas-microsoft-com:office:excel") ,new XAttribute(XNamespace.Xmlns + "s", "urn:schemas-microsoft-com:office:spreadsheet")//erreur le nom ne peut pas être null

                            new XElement("Workbook",new XAttribute("xmlns", "urn:schemas-microsoft-com:office:spreadsheet"), new XAttribute(XNamespace.Xmlns + "x","urn:schemas-microsoft-com:office:excel") ,new XAttribute(XNamespace.Xmlns + "s", "urn:schemas-microsoft-com:office:spreadsheet"),
//erreur Le préfixe '' ne peut pas être redéfini à partir de '' vers 'urn:schemas-microsoft-com:office:spreadsheet' au sein de la même balise d'élément de début.



Merci d'avance pour vos suggestions

1 réponse

Whismeril Messages postés 17806 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 septembre 2022 618
Modifié par Whismeril le 11/08/2014 à 23:43
Sujet résolu ici.

Une fois le document généré, on affecte partout le namesapce par défaut grace à cette methode d'extension



Penser aux balises de coloration syntaxique: bouton <>, préciser le langage :<code csharp>.
Quand la solution est trouvée, mettre la discussion Résolue.
2