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.