Question

Je ne parviens pas à créer un document XML contenant un espace de nom par défaut et un espace de nom nommé. Difficile à expliquer, il est plus facile d'expliquer ce que j'essaie de produire ...

<Root xmlns="http://www.adventure-works.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:SchemaLocation="http://www.SomeLocatation.Com/MySchemaDoc.xsd">
  <Book title="Enders Game" author="Orson Scott Card" />
  <Book title="I Robot" author="Isaac Asimov" />
</Root>

mais je me retrouve avec ceci…

<Root xmlns="http://www.adventure-works.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:SchemaLocation="http://www.SomeLocatation.Com/MySchemaDoc.xsd">
  <Book p3:title="Enders Game" p3:author="Orson Scott Card" xmlns:p3="http://www.adventure-works.com" />
  <Book p3:title="I Robot" p3:author="Isaac Asimov" xmlns:p3="http://www.adventure-works.com" />
</Root>

Le code que j'ai écrit pour produire cet extrait de code XML est le suivant ...

  XNamespace aw = "http://www.adventure-works.com";
  XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
  XElement root = new XElement(aw + "Root",
      new XAttribute("xmlns", "http://www.adventure-works.com"),
      new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
      new XAttribute(xsi + "SchemaLocation", "http://www.SomeLocatation.Com/MySchemaDoc.xsd"),

      new XElement(aw + "Book",
        new XAttribute(aw + "title", "Enders Game"),
        new XAttribute(aw + "author", "Orson Scott Card")),
      new XElement(aw + "Book",
        new XAttribute(aw + "title", "I Robot"),
        new XAttribute(aw + "author", "Isaac Asimov")));

basé sur un exemple sur MSDN

**** EDIT ****

Ok, avec quelques expériences supplémentaires, je suis maintenant très confus sur le fonctionnement des espaces de noms XML ....

si je supprime le mot theattribute, j'obtiens ce que j'étais après ... mais maintenant, il semble que ce que je cherchais ne correspond pas vraiment à mes attentes. Je pensais que les espaces de noms étaient hérités de leurs parents, n'est-ce pas également le cas des attributs? parce que ce code pour lire les attributs ne fonctionne pas comme prévu ...

  XElement xe = XElement.Parse(textBox1.Text);
  XNamespace aw = "http://www.adventure-works.com";
  var qry = from x in xe.Descendants(aw + "Book")
            select (string)x.Attribute(aw + "author");

Cependant, si je supprime le aw + de l'attribut, c'est ok, ce qui me laisse supposer que je ne peux pas avoir d'attributs dans l'espace de nom par défaut. Est-ce correct?

Était-ce utile?

La solution

Bonne question. J'ai fouillé un peu et trouvé cette partie de la spécification XML :

  

Une déclaration d'espace de nom par défaut   s'applique à tous les éléments non préfixés   noms dans sa portée. Défaut   les déclarations d'espace de noms ne s'appliquent pas   directement attribuer des noms; le   interprétation de non préfixé   les attributs sont déterminés par le   élément sur lequel ils apparaissent.

Nous donnerons ensuite cet exemple:

  

Par exemple, chacune des mauvaises balises d'élément vide est illégale dans les cas suivants:

<!-- http://www.w3.org is bound to n1 and n2 -->
<x xmlns:n1="http://www.w3.org" 
   xmlns:n2="http://www.w3.org" >
  <bad a="1"     a="2" />
  <bad n1:a="1"  n2:a="2" />
</x>
  

Cependant, chacun des éléments suivants est légal, le second, car l’espace de nom par défaut ne le permet pas. appliquer aux noms d'attributs:

<!-- http://www.w3.org is bound to n1 and is the default -->
<x xmlns:n1="http://www.w3.org" 
   xmlns="http://www.w3.org" >
  <good a="1"     b="2" />
  <good a="1"     n1:a="2" />
</x>

Donc, en gros, il semble que les noms d'attributs n'obtiennent pas d'espaces de noms par défaut, ce qui explique tout ce que vous avez vu:)

Autres conseils

XElement doc = XElement.Parse(ToXml());
doc.DescendantsAndSelf().Attributes().Where(a => a.IsNamespaceDeclaration).Remove();
var ele = doc.DescendantsAndSelf();
foreach (var el in ele)
    el.Name = ns != null ? ns + el.Name.LocalName : el.Name.LocalName;

Pour ceux qui ont passé deux jours à essayer de trouver une réponse.

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