Erstellen von XML mit Namespaces und Schemas aus einem XElement

Eine langatmige Frage - bitte tragen Sie mit mir!

Ich möchte programmgesteuert ein XML-Dokument mit Namespaces und Schemas erstellen. So etwas wie

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

Verwende ich das ziemlich großartige neue LINQ-Material (was für mich neu ist) und hoffte, das oben gesagte mit einem XElement zu tun.

Ich habe eine ToXElement()-Methode für mein Objekt:

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

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

     return xe;
  }

, die mir den Namespace korrekt gibt, also:

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

Meine Frage: Wie kann ich die Attribute schema xmlns:xsi und xsi:schemaLocation hinzufügen?

(BTW Ich kann keine einfachen XAtttribute verwenden, da ich eine Fehlermeldung für die Verwendung des Doppelpunkts ":" in einem Attributnamen erhalte...) " -27-" Oder muss ich ein XDocument oder eine andere LINQ-Klasse verwenden?

Danke...

Antwort auf "Erstellen von XML mit Namespaces und Schemas aus einem XElement " 2 von antworten

Von diesem article, it looks like you new up more than one XNamespace, add an attribute in the root, and then go to town with both XNamespaces. sieht es aus, als ob Sie mehr als einen XNamespace neu erstellen, ein Attribut im Stamm hinzufügen und dann mit beiden XNamespaces in die Stadt gehen.

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

Hier ist ein forum post showing how to do the schemalocation. zeigt, wie die Schemalokalisierung zu tun.

Dank David B - ich bin mir nicht ganz sicher, ob ich das alles verstehe, aber dieser Code bringt mir, was ich brauche...

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

Es scheint, dass das Verketten eines Namespace plus einer Zeichenfolge z. B.

w3nsp + "schemaLocation"
gives an attribute called ein Attribut namens
xsi:schemaLocation
in the resulting XML, which is what I need. im resultierenden XML gibt, was ich brauche.