Question

Une longue question - supportez-moi s'il vous plaît!

Je souhaite créer par programme un document XML avec des espaces de noms et des schémas. Quelque chose comme

<myroot 
    xmlns="http://www.someurl.com/ns/myroot" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.someurl.com/ns/myroot http://www.someurl.com/xml/schemas/myschema.xsd">

    <sometag>somecontent</sometag>

</myroot>

J'utilise la nouvelle version plutôt splendide de LINQ (ce qui est nouveau pour moi), et espérais faire ce qui précède à l'aide d'un XElement.

J'ai une méthode ToXElement () sur mon objet:

  public XElement ToXElement()
  {
     XNamespace xnsp = "http://www.someurl.com/ns/myroot";

     XElement xe = new XElement(
        xnsp + "myroot",
           new XElement(xnsp + "sometag", "somecontent")
        );

     return xe;
  }

qui me donne correctement l’espace de nom, ainsi:

<myroot xmlns="http://www.someurl.com/ns/myroot">
   <sometag>somecontent</sometag>
</myroot>

Ma question: comment puis-je ajouter les attributs de schéma xmlns: xsi et xsi: schemaLocation?

(En passant, je ne peux pas utiliser de simples XAtttributes car j'obtiens une erreur en utilisant le signe deux-points ":" dans un nom d'attribut ...)

Ou dois-je utiliser un XDocument ou une autre classe LINQ?

Merci ...

Était-ce utile?

La solution

À partir de cet article , il semble que vous ayez plus de nouveautés que plus un XNamespace, ajoutez un attribut à la racine, puis accédez à la ville avec les deux espaces XNames.

// The http://www.adventure-works.com namespace is forced to be the default namespace.
XNamespace aw = "http://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
    new XAttribute("xmlns", "http://www.adventure-works.com"),
///////////  I say, check out this line.
    new XAttribute(XNamespace.Xmlns + "fc", "www.fourthcoffee.com"),
///////////
    new XElement(fc + "Child",
        new XElement(aw + "DifferentChild", "other content")
    ),
    new XElement(aw + "Child2", "c2 content"),
    new XElement(fc + "Child3", "c3 content")
);
Console.WriteLine(root);

Voici un message sur le forum indiquant comment procéder pour faire de la schemalocation. .

Autres conseils

Merci à David B - Je ne suis pas certain de comprendre tout cela, mais ce code me procure ce dont j'ai besoin ...

  public XElement ToXElement()
  {
     const string ns = "http://www.someurl.com/ns/myroot";
     const string w3 = "http://wwww.w3.org/2001/XMLSchema-instance";
     const string schema_location = "http://www.someurl.com/ns/myroot http://www.someurl.com/xml/schemas/myschema.xsd";

     XNamespace xnsp = ns;
     XNamespace w3nsp = w3;

     XElement xe = new XElement(xnsp + "myroot",
           new XAttribute(XNamespace.Xmlns + "xsi", w3),
           new XAttribute(w3nsp + "schemaLocation", schema_location),
           new XElement(xnsp + "sometag", "somecontent")
        );

     return xe;
  }

Il semble que concaténer un espace de noms plus une chaîne, par exemple

w3nsp + "schemaLocation"
donne un attribut appelé
xsi:schemaLocation
dans le XML résultant, ce dont j'ai besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top