Domanda

Sto riscontrando problemi nella creazione di un documento XML che contiene uno spazio dei nomi predefinito e uno spazio dei nomi denominato, difficile da spiegare più facile da mostrare semplicemente ciò che sto cercando di produrre ...

<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>

ma quello che finisco è questo ...

<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>

Il codice che ho scritto per produrre questo frammento XML è questo ...

  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")));

basato su un esempio su MSDN

**** **** EDIT

Ok, con qualche altra sperimentazione ora sono molto confuso su come funzionano gli spazi dei nomi XML ....

se rimuovo l'attributo th + aw ottengo ciò che stavo cercando ... ma ora sembra che ciò che stavo cercando non sia effettivamente quello che mi aspettavo. Pensavo che gli spazi dei nomi fossero ereditati dai loro genitori, non è vero anche per gli attributi? perché, questo codice per leggere gli attributi non funziona come mi aspettavo ...

  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");

Tuttavia, se rimuovo aw + sull'attributo è ok, portandomi ad assumere che non posso avere attributi nello spazio dei nomi predefinito. È corretto?

È stato utile?

Soluzione

Buona domanda. Ho cercato un po 'e ho trovato questo bit delle specifiche XML :

  

Una dichiarazione di spazio dei nomi predefinita   si applica a tutti gli elementi non prefissati   nomi nel suo ambito. Predefinito   le dichiarazioni dello spazio dei nomi non si applicano   direttamente per attribuire nomi; il   interpretazione di non prefissato   gli attributi sono determinati dal   elemento su cui appaiono.

Segue in seguito questo esempio:

  

Ad esempio, ciascuno dei tag errati di elementi vuoti è illegale nei seguenti casi:

<!-- 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>
  

Tuttavia, ognuna delle seguenti è legale, la seconda perché lo spazio dei nomi predefinito non è > applica ai nomi degli attributi:

<!-- 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>

Quindi, in sostanza, sembra che i nomi degli attributi non ottengano spazi dei nomi per impostazione predefinita, il che spiega tutto ciò che hai visto :)

Altri suggerimenti

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;

Per chiunque abbia trascorso 2 giorni a cercare una risposta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top