Frage

Ich habe Probleme ein XML-Dokument zu erstellen, die einen Standard-Namespace und eine benannte Namespace enthält, schwer zu erklären einfacher, nur zu zeigen, was ich versuche zu produzieren ...

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

aber was ich am Ende mit diesem ...

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

Der Code, den ich diesen XML-Schnipsel zu produzieren geschrieben habe, ist diese ...

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

basierend auf einem Beispiel auf MSDN

**** EDIT ****

Ok, mit etwas mehr Experimenten bin ich jetzt sehr verwirrt, wie XML-Namespaces arbeiten ....

, wenn ich das aw + theattribute entfernen bekomme ich, was ich nach ... aber jetzt scheint es, dass das, was ich war nach nicht eigentlich ist das, was ich erwartet hatte. Ich dachte, dass Namespaces von ihren Eltern geerbt wurde, ist dies nicht der Fall von Attributen wie gut? dieser Code, weil die Attribute lesen funktioniert nicht wie ich erwartet hatte ...

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

Allerdings, wenn ich das aw + auf dem Attribut seine Ordnung, was mich zu entfernen, anzunehmen, dass ich nicht Attribute im Standard-Namespace haben. Ist das richtig?

War es hilfreich?

Lösung

Gute Frage. Ich grub ein wenig herum und fand dieses Bit der XML-Spezifikation :

  

Eine Standardnamespace-Deklaration   gilt für alle ohne Präfix Element   Namen in ihrem Umfang. Standard   Namespace-Deklarationen nicht gelten   direkt Namen zuzuordnen; das   Interpretation ohne Präfix   Attribute durch die ermittelte   Element, auf dem sie erscheinen.

Es geht später auf, diesem Beispiel zu geben:

  

Zum Beispiel kann jede der schlechten Leeres-Element-Tags ist illegal in dem folgenden:

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

Jedoch ist jede der folgenden legal ist, die zweite, weil der Standard-Namespace nicht> anwenden Namen zuzuordnen:

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

Also im Grunde sieht es aus wie Attributnamen nicht bekommen, Namespaces standardmäßig, die alles, was Sie gesehen haben, erklärt:)

Andere Tipps

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;

Für alle anderen, die 2 Tage lang versucht, eine Antwort zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top