Meilleur auteur de réponses
C#: Linq To Xml, deux fois le même Namespace dans une seule balise

Question
-
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 codeXNamespace 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
Réponses
-
Bonjour,
Vous devez parcourir votre document et appliquer le namespace par défaut comme expliqué ici : http://stackoverflow.com/questions/2874422/how-to-set-the-default-xml-namespace-for-an-xdocument
Cordialement
Gilles TOURREAU - MVP C#
Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
- MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
- MCSA : SQL Server 2012
- MCITP : SQL Server 2008 Developper
- MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure- Marqué comme réponse Whismeril vendredi 21 mars 2014 09:05
Toutes les réponses
-
Bonjour,
Vous devez parcourir votre document et appliquer le namespace par défaut comme expliqué ici : http://stackoverflow.com/questions/2874422/how-to-set-the-default-xml-namespace-for-an-xdocument
Cordialement
Gilles TOURREAU - MVP C#
Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
- MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
- MCSA : SQL Server 2012
- MCITP : SQL Server 2008 Developper
- MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure- Marqué comme réponse Whismeril vendredi 21 mars 2014 09:05
-
-
Et bien ça marche,
ça ne donne pas le résultat que je montrais, ce code rajoute s: partout où il n'y a pas d'alias pour le NameSpace.
On se retrouve avec un fichier différent du format xml Excel 2003 généré par Excel.
Mais il est lu sans problème par Excel, ce qui est mon besoin final.
Merci beaucoup