Die gängige Praxis in. NET ist XML Serialization zu verwenden.
In Ihrem Fall würde ich dies tun:
- laufen die xsd.exe auch auf .XSD auf den Quellcode für die Klassen (xsd/c)
- bauen Sie Ihre App zu generieren, die diese generierten Klassen verwendet . Beachten Sie, dass Sie diese Klassen über die Methode "partial classes"
- in Code erweitern, einen XmlSerializer instanziieren und die Klasseninstanzen serialisieren können.
Beispiel:
Vor diesem Schema:
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Foo" nillable="true" type="Foo" />
<xs:complexType name="Foo">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Bar" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="Baz" type="UntypedArray" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="UntypedArray">
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="Type1" type="Type1" minOccurs="1" maxOccurs="1"/>
<xs:any namespace="##other" processContents="lax" minOccurs="1" maxOccurs="1"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="Type1" mixed="true">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Child" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
xsd.exe erzeugt diesen Quellcode:
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=true)]
public partial class Foo {
private string barField;
private object[] bazField;
/// <remarks/>
public string Bar {
get {
return this.barField;
}
set {
this.barField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlArrayItemAttribute("", typeof(System.Xml.XmlElement), IsNullable=false)]
[System.Xml.Serialization.XmlArrayItemAttribute(typeof(Type1), IsNullable=false)]
public object[] Baz {
get {
return this.bazField;
}
set {
this.bazField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class Type1 {
private string childField;
private string[] textField;
/// <remarks/>
public string Child {
get {
return this.childField;
}
set {
this.childField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public string[] Text {
get {
return this.textField;
}
set {
this.textField = value;
}
}
}
In Ihrer App Sie Foo instanziiert und dann serialisiert, so:
Foo foo = new Foo();
// ...populate foo here...
var builder = new System.Text.StringBuilder();
XmlSerializer s = new XmlSerializer(typeof(Foo));
using (var writer = System.Xml.XmlWriter.Create(builder))
{
s.Serialize(writer, foo, ns);
}
string rawXml = builder.ToString();
Dieses Beispiel wird in eine Zeichenfolge serialisiert.Natürlich können Sie mit anderen XmlWritern serialisieren, Sie können in eine Datei schreiben, in irgendeinen beliebigen Stream und so weiter.
Normalerweise zwicke ich die Serialisierung, um die XML-Deklaration wegzulassen, die Standard-XML-Namespaces wegzulassen und so weiter. Wie folgt aus:
Foo foo = new Foo();
// ...populate foo here...
var builder = new System.Text.StringBuilder();
var settings = new System.Xml.XmlWriterSettings { OmitXmlDeclaration = true, Indent= true };
var ns = new XmlSerializerNamespaces();
ns.Add("","");
XmlSerializer s = new XmlSerializer(typeof(Foo));
using (var writer = System.Xml.XmlWriter.Create(builder, settings))
{
s.Serialize(writer, foo, ns);
}
string rawXml = builder.ToString();
Sie auch die umgekehrten tun kann - Karte aus einem XML-Dokument an einen In-Memory-Objektgraph - die XmlSerializer verwenden. Verwenden Sie die Deserialize-Methode.
Txs, ich denke, es hat gut funktioniert, aber ich werde es testen ... eine andere Frage, wie kann ich die XML-Ausgabe "verschönern"? ich meine ... ich möchte auch eine menschlichere lesbare xml haben ... –
hängt davon ab, was Sie mit "verschönern" meinen. Wenn Sie "Einrückung" meinen, dann sorgt der zweite Code-Ausschnitt oben für eine eingerückte XML-Ausgabe. Wenn Sie etwas anderes meinen, erklären Sie bitte. – Cheeso
Ja, ich meinte Indent, danke ... ich habe es schon gelesen !! –