c# schema namespaces xelement

c# - Creación de XML con espacios de nombres y esquemas desde un XElement



schema namespaces (2)

A partir de este artículo , parece que has creado más de un XNamespace, agrega un atributo en la raíz y luego vas a la ciudad con ambos XNamespaces.

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

Aquí hay una publicación en el foro que muestra cómo hacer la ubicación del esquema.

Una pregunta larga: por favor tengan paciencia conmigo!

Quiero crear programáticamente un documento XML con espacios de nombres y esquemas. Algo como

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

Estoy usando el nuevo y espléndido material de LINQ (que es nuevo para mí), y esperaba hacer lo anterior con un XElement.

Tengo un método ToXElement () en mi objeto:

public XElement ToXElement() { XNamespace xnsp = "http://www.someurl.com/ns/myroot"; XElement xe = new XElement( xnsp + "myroot", new XElement(xnsp + "sometag", "somecontent") ); return xe; }

que me da el espacio de nombre correctamente, así:

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

Mi pregunta: ¿cómo puedo agregar los atributos schema xmlns: xsi y xsi: schemaLocation?

(Por cierto, no puedo usar XAtttributes simples ya que recibo un error al usar los dos puntos ":" en un nombre de atributo ...)

¿O necesito usar un XDocument o alguna otra clase LINQ?

Gracias...


Gracias a David B: no estoy seguro de entender todo esto pero este código me da lo que necesito ...

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

Parece que la concatenación de un espacio de nombres más una cadena, por ejemplo

w3nsp + "schemaLocation" da un atributo llamado

xsi:schemaLocation en el XML resultante, que es lo que necesito.