Erstellen von XML-Namespaces und Schema von einem XElement
-
22-07-2019 - |
Frage
Eine langatmige Frage - bitte Geduld mit mir
Ich mag programmatisch ein XML-Dokument mit Namespaces und Schema 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>
Ich bin die eher prächtigen neuen LINQ Sachen mit (das ist neu für mich), und hoffte, dass die oben mit einem XElement zu tun.
Ich habe eine ToXElement () -Methode für mein Objekt bekommen:
public XElement ToXElement()
{
XNamespace xnsp = "http://www.someurl.com/ns/myroot";
XElement xe = new XElement(
xnsp + "myroot",
new XElement(xnsp + "sometag", "somecontent")
);
return xe;
}
das gibt mir den Namespace korrekt, also:
<myroot xmlns="http://www.someurl.com/ns/myroot">
<sometag>somecontent</sometag>
</myroot>
Meine Frage: Wie kann ich das schema xmlns: xsi und xsi: schema Attribute
(BTW kann ich nicht einfach XAtttributes benutzen, wie ich einen Fehler für die Verwendung des Doppelpunkt „:“ in einem Attributnamen ...)
Oder muss ich eine XDocument oder eine andere LINQ-Klasse verwenden?
Danke ...
Lösung
Von diesem Artikel , sieht es aus wie Sie neue mehr als ein XNamespace, ein Attribut in der Wurzel hinzufügen und gehen dann in die Stadt mit den beiden 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);
Hier ist ein Forum posten das zeigt, wie das schema zu tun .
Andere Tipps
Dank David B - Ich bin nicht ganz sicher, ob ich das alles verstehen, aber dieser Code wird 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 ein Namensraum und einen String zB verketten
w3nsp + "schemaLocation"ein Attribut gibt
xsi:schemaLocationin der resultierenden XML genannt, was ist das, was ich brauche.