.NETの主流はXML Serializationです。あなたのケースでは
、私はこれを行うだろう:
- は、これらの生成されたクラスを利用してアプリを構築
- クラス(XSD/C)のソースコードを生成するために、.XSDにすぎXsd.exeでは実行。これらのクラスを「部分クラス」テクニック
- で拡張し、XmlSerializerをインスタンス化し、クラスインスタンスをシリアル化することができます。
例:
はこのスキーマを考える:あなたはFooのをインスタンス化して、シリアル化することができ、あなたのアプリに
[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;
}
}
}
、:
<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では、このソースコードを生成このように:
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();
この例では、文字列にシリアル化されています。もちろん、他のXmlWriterにシリアライズすることも、ファイルに書き込むことも、任意のストリームに書き出すことなどもできます。
通常、XML宣言を省略するためにシリアライズを調整し、デフォルトのXML名前空間を省略します。このように: - メモリ内のオブジェクトグラフへのXMLドキュメントからマップ -
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();
また、逆の操作を行うことができますのXmlSerializerを使用します。 Deserializeメソッドを使用します。
Txs、私はそれがうまくいったと思うが、私はそれをテストしようとしている...別の質問、どのように私はXML出力を美しくすることができますか?私は...もっと人間が読めるXMLを持っていたいと思っています。 –
は "美化"という言葉によって決まります。もしあなたが "インデント"を意味するならば、上記の2番目のコードスニップはインデントされたXML出力を提供します。他の何かを意味するなら、plsは説明する。 – Cheeso
ええ、私はインデント、感謝を意味...私はすでにそれを読んで! –