2008-12-02 13 views
12

Una pregunta larga: por favor tengan paciencia conmigo!Creando XML con espacios de nombres y esquemas de un XElement

Quiero programar mediante programación un documento XML con espacios de nombres y esquemas. Algo así 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 la más espléndida cosas nuevas LINQ (que es nuevo para mí), y tenía la esperanza de hacer lo anterior utilizando 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 nombres correctamente, por lo tanto:

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

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

(Por cierto que no puedo usar XAtttributes simples como me sale un error para el uso de los dos puntos ":" en un nombre de atributo ...)

o tengo que utilizar un XDocument o alguna otra clase de LINQ ?

Gracias ...

Respuesta

7

De esta article, parece que nuevo hasta más de un XNamespace, añadir un atributo en la raíz, y luego ir a la ciudad con las dos 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 forum post mostrando cómo hacer el schemaLocation.

7

Gracias a David B - No estoy muy seguro de entender todo esto, pero este código consigo 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 de por ejemplo

w3nsp + "schemaLocation"
da una atributo llamado
xsi:schemaLocation
en el XML resultante, que es lo que necesito.

Cuestiones relacionadas