Comment obtenir que LinqToXSD génère correctement les déclarations de préfixes d’espaces de noms?

J’essaie de créer des classes de liaison de données XML avec LinqToXSD et un schéma XML contenant un certain nombre de schémas importés. Tous les schémas sont situés ici.

Pour ce faire, j’ai utilisé le document de schéma racine suivant:

               Tmats Root    

J’ai créé des classes en utilisant Linq to XSD. J’ai ensuite écrit le test suivant:

 [TestMethod()] public void TmatsXmlExample4() { Tmats tmats = new Tmats { ProgramName = "My Program", OriginationDate = DateTime.Now, }; tmats.PointOfContact.Add(new PointOfContactType { Address = "12345 Anywhere Street", Agency = "My Agency", Name = "Robert Harvey", Telephone = "111-222-3333" }); Debug.Print(tmats.ToSsortingng()); } 

Je m’attendais à une sortie ressemblant à ceci:

  My Program 2012-05-09-07:00  Robert Harvey My Agency 12345 Anywhere Street 111-222-3333   

Au lieu de cela, ce que j’ai obtenu était ceci:

  My Program 2012-05-09-07:00  Robert Harvey My Agency 
12345 Anywhere Street
111-222-3333

Existe-t-il un moyen de faire en sorte que LinqToXSD produise la sortie attendue?

Vous devez mapper chacun des schémas importés:

   

elementFormDefault s’applique uniquement au schéma dans lequel il se trouve et ne remplace pas les parameters d’inclusion ou d’importation.

Si vous souhaitez masquer les espaces de noms, tous les schémas doivent spécifier elementFormDefault = “unqualified”. De même, si vous souhaitez exposer des espaces de noms, chaque schéma doit spécifier elementFormDefault = ” qualifié

MIS À JOUR après avoir examiné les tests unitaires:

Votre consortingbution:

  My Project 2012-05-15 

Votre sortie:

   My Project 2012-05-15 

Le problème en suspens est la duplication de la balise – tout me semble aller, mais j’ai toujours du mal à comprendre pourquoi cela se produit.

UPDATE lundi:

Je pense qu’il y a un bogue dans l’outil LinqToXSD: j’ai parcouru toutes les combinaisons auxquelles je peux penser et que je ne peux pas toujours résoudre régulièrement, mais … j’ai réussi à résoudre le problème de duplication :

Dans votre fichier XmlHelper, changez l’instruction return:

 System.Xml.Linq.XDocument xd = System.Xml.Linq.XDocument.Parse(sb.ToSsortingng()); return xd.Root.FirstNode.ToSsortingng(); 

Je sais que c’est un hack , mais cela résout le problème et votre test LoopbackTest passe.

Vous n’obtenez pas de préfixe si vous créez des éléments à l’aide de la classe Tmats, j’ai essayé diverses combinaisons d’atsortingbuts et le mieux que j’ai pu faire était de rattacher des espaces de noms. Si vous échangez des informations avec un système externe, j’ai un correctif :

  1. Utilisez votre object Tmats dans votre code,
  2. Sérialisez-le avec des espaces de noms,
  3. Exécutez-le via un XSLT pour mapper ns aux préfixes.

Je sais que c’est maladroit, mais je pense que c’est le meilleur moyen pour vous de ne pas réparer le code LinqToXSD.

XSLT pour mapper les espaces de noms en préfixes (vous devez conserver l’ensemble des espaces de noms dans la déclaration ‘stylesheet’ et dans le ‘mappeur’:

                               

Produit:

  My Program 2012-05-09-07:00  Robert Harvey My Agency 12345 Anywhere Street 111-222-3333   

Ok, c’est donc loin d’être idéal, mais votre code fonctionne correctement en interne pour le projet. Il ne s’agit que lorsque vous avez besoin d’interagir avec d’autres personnes pour lesquelles vous auriez besoin de corriger la sortie XML (pensez à changer elementFormDefault = “qualifié” (ou à supprimer il) dans votre XSD) – si vous mettez en cache le XSLT en tant que XslComstackdTransform vous remarquerez à peine que cela se produit.