Creazione di XML con spazi dei nomi e schemi da un XElement
-
22-07-2019 - |
Domanda
Una domanda lungimirante - per favore abbi pazienza!
Voglio creare programmaticamente un documento XML con spazi dei nomi e schemi. Qualcosa come
<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>
Sto usando le nuove cose LINQ piuttosto splendide (che sono nuove per me), e speravo di fare quanto sopra usando un XElement.
Ho un metodo ToXElement () sul mio oggetto:
public XElement ToXElement()
{
XNamespace xnsp = "http://www.someurl.com/ns/myroot";
XElement xe = new XElement(
xnsp + "myroot",
new XElement(xnsp + "sometag", "somecontent")
);
return xe;
}
che mi dà lo spazio dei nomi correttamente, quindi:
<myroot xmlns="http://www.someurl.com/ns/myroot">
<sometag>somecontent</sometag>
</myroot>
La mia domanda: come posso aggiungere gli schemi xmlns: xsi e xsi: attributi schemaLocation?
(A proposito, non riesco a usare XAtttributes semplici poiché visualizzo un errore nell'uso dei due punti ": " in un nome di attributo ...)
O devo usare un XDocument o qualche altra classe LINQ?
Grazie ...
Soluzione
Da questo articolo , ti sembra nuovo di più di uno XNamespace, aggiungi un attributo nella radice e poi vai in città con entrambi gli XNamespace.
// 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);
Ecco un post sul forum che mostra come eseguire lo schema .
Altri suggerimenti
Grazie a David B - Non sono sicuro di aver capito tutto questo, ma questo codice mi offre ciò di cui ho bisogno ...
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;
}
Sembra che concatenare uno spazio dei nomi più una stringa, ad esempio
w3nsp + "schemaLocation"dia un attributo chiamato
xsi:schemaLocationnell'XML risultante, che è ciò di cui ho bisogno.