Заполнение XML по XSD - C#
Формулировка задачи:
Доброго времени суток, уважаемые!
Вопрос по заполнению XML файла по известной схеме XSD.
Что имеем:
1) схема XSD
2) сгенерированный класс по схеме (использовал http://www.httputility.net/xsd-to-csharp-vb-class.aspx и утилиту Xsd2Code)
3) требуется заполнить xml файл
примерный код функции:
рут REF заполняется легко:
не могу понять как заполнить остальные данные
XML файл должен быть такой:
Заранее спасибо за подсказки и помощь!
в чем может быть проблема?
<?xml version="1.0" encoding="windows-1251"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="REF">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="MAIN">
<xs:complexType>
<xs:sequence>
<xs:element name="MAIN_LINE">
<xs:complexType>
<xs:sequence>
<xs:element name="MAIN_LINE" maxOccurs="1">
<xs:complexType>
<xs:attribute name="DATE" type="xs:date" use="required" />
<xs:attribute name="COMMENT" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="ID" type="xs:unsignedInt" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="action" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:schema>using System;
using System.Diagnostics;
using System.Xml.Serialization;
using System.Collections;
using System.Xml.Schema;
using System.ComponentModel;
using System.IO;
using System.Text;
namespace AutoGeneratedCode
{
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34234")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class REF
{
private REFMAIN[] mAINField;
private string nameField;
private string actionField;
private static System.Xml.Serialization.XmlSerializer serializer;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("MAIN")]
public REFMAIN[] MAIN
{
get
{
return this.mAINField;
}
set
{
this.mAINField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string name
{
get
{
return this.nameField;
}
set
{
this.nameField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string action
{
get
{
return this.actionField;
}
set
{
this.actionField = value;
}
}
private static System.Xml.Serialization.XmlSerializer Serializer {
get {
if ((serializer == null)) {
serializer = new System.Xml.Serialization.XmlSerializer(typeof(REF));
}
return serializer;
}
}
#region Serialize/Deserialize
/// <summary>
/// Serializes current REF object into an XML document
/// </summary>
/// <returns>string XML value</returns>
public virtual string Serialize() {
System.IO.StreamReader streamReader = null;
System.IO.MemoryStream memoryStream = null;
try {
memoryStream = new System.IO.MemoryStream();
Serializer.Serialize(memoryStream, this);
memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
streamReader = new System.IO.StreamReader(memoryStream);
return streamReader.ReadToEnd();
}
finally {
if ((streamReader != null)) {
streamReader.Dispose();
}
if ((memoryStream != null)) {
memoryStream.Dispose();
}
}
}
/// <summary>
/// Deserializes workflow markup into an REF object
/// </summary>
/// <param name="xml">string workflow markup to deserialize</param>
/// <param name="obj">Output REF object</param>
/// <param name="exception">output Exception value if deserialize failed</param>
/// <returns>true if this XmlSerializer can deserialize the object; otherwise, false</returns>
public static bool Deserialize(string xml, out REF obj, out System.Exception exception) {
exception = null;
obj = default(REF);
try {
obj = Deserialize(xml);
return true;
}
catch (System.Exception ex) {
exception = ex;
return false;
}
}
public static bool Deserialize(string xml, out REF obj) {
System.Exception exception = null;
return Deserialize(xml, out obj, out exception);
}
public static REF Deserialize(string xml) {
System.IO.StringReader stringReader = null;
try {
stringReader = new System.IO.StringReader(xml);
return ((REF)(Serializer.Deserialize(System.Xml.XmlReader.Create(stringReader))));
}
finally {
if ((stringReader != null)) {
stringReader.Dispose();
}
}
}
/// <summary>
/// Serializes current REF object into file
/// </summary>
/// <param name="fileName">full path of outupt xml file</param>
/// <param name="exception">output Exception value if failed</param>
/// <returns>true if can serialize and save into file; otherwise, false</returns>
public virtual bool SaveToFile(string fileName, out System.Exception exception) {
exception = null;
try {
SaveToFile(fileName);
return true;
}
catch (System.Exception e) {
exception = e;
return false;
}
}
public virtual void SaveToFile(string fileName) {
System.IO.StreamWriter streamWriter = null;
try {
string xmlString = Serialize();
System.IO.FileInfo xmlFile = new System.IO.FileInfo(fileName);
streamWriter = xmlFile.CreateText();
streamWriter.WriteLine(xmlString);
streamWriter.Close();
}
finally {
if ((streamWriter != null)) {
streamWriter.Dispose();
}
}
}
/// <summary>
/// Deserializes xml markup from file into an REF object
/// </summary>
/// <param name="fileName">string xml file to load and deserialize</param>
/// <param name="obj">Output REF object</param>
/// <param name="exception">output Exception value if deserialize failed</param>
/// <returns>true if this XmlSerializer can deserialize the object; otherwise, false</returns>
public static bool LoadFromFile(string fileName, out REF obj, out System.Exception exception) {
exception = null;
obj = default(REF);
try {
obj = LoadFromFile(fileName);
return true;
}
catch (System.Exception ex) {
exception = ex;
return false;
}
}
public static bool LoadFromFile(string fileName, out REF obj) {
System.Exception exception = null;
return LoadFromFile(fileName, out obj, out exception);
}
public static REF LoadFromFile(string fileName) {
System.IO.FileStream file = null;
System.IO.StreamReader sr = null;
try {
file = new System.IO.FileStream(fileName, FileMode.Open, FileAccess.Read);
sr = new System.IO.StreamReader(file);
string xmlString = sr.ReadToEnd();
sr.Close();
file.Close();
return Deserialize(xmlString);
}
finally {
if ((file != null)) {
file.Dispose();
}
if ((sr != null)) {
sr.Dispose();
}
}
}
#endregion
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34234")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class REFMAIN
{
private REFMAINMAIN_LINE mAIN_LINEField;
private uint idField;
/// <remarks/>
public REFMAINMAIN_LINE MAIN_LINE
{
get
{
return this.mAIN_LINEField;
}
set
{
this.mAIN_LINEField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public uint ID
{
get
{
return this.idField;
}
set
{
this.idField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34234")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class REFMAINMAIN_LINE
{
private REFMAINMAIN_LINEMAIN_LINE mAIN_LINEField;
/// <remarks/>
public REFMAINMAIN_LINEMAIN_LINE MAIN_LINE
{
get
{
return this.mAIN_LINEField;
}
set
{
this.mAIN_LINEField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34234")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class REFMAINMAIN_LINEMAIN_LINE
{
private System.DateTime dATEField;
private string cOMMENTField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="date")]
public System.DateTime DATE
{
get
{
return this.dATEField;
}
set
{
this.dATEField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string COMMENT
{
get
{
return this.cOMMENTField;
}
set
{
this.cOMMENTField = value;
}
}
}
} private void CreateXML(Dictionary<uint, string> myDataList)
{
string name = "MyName"; // -> name
string action = "read"; // -> action
REF myref = new REF(); // root element
myref.name = name;
myref.action = action;
//mydate -> DATE
DateTime mydate = new System.DateTime(DateTime.Now.Year, 1, 1, 0, 0, 0, 0);
foreach (var mydt in myDataList)
{
//mydt.Key -> ID, mydt.Value -> COMMENT;
}
myref.Serialize();
myref.SaveToFile(xmlfile);
}<?xml version="1.0" encoding="WINDOWS-1251"?> <REF name="MyName" action="read">
<?xml version="1.0" encoding="WINDOWS-1251"?> <REF name="MyName" action="read"> <MAIN ID="1"> <MAIN_LINE> <MAIN_LINE DATE="2015-01-01" COMMENT=""/> </MAIN_LINE> </MAIN> </REF>
сделал, но почему-то сохраняется только последний элемент из списка:
private void CreateXML(Dictionary<uint, string> myDataList)
{
string name = "MyName"; // -> name
string action = "read"; // -> action
REF myref = new REF(); // root element
myref.name = name;
myref.action = action;
//mydate -> DATE
DateTime mydate = new System.DateTime(DateTime.Now.Year, 1, 1, 0, 0, 0, 0);
foreach (var mydt in myDataList)
{
REFMAINMAIN_LINE refmainline = new REFMAINMAIN_LINE();
refmainline.MAIN_LINE = new REFMAINMAIN_LINEMAIN_LINE();
refmainline.MAIN_LINE.DATE = mydate;
refmainline.MAIN_LINE.COMMENT= mydt.Value;
REFMAIN refmain = new REFMAIN();
refmain.REFMAINMAIN_LINE = refmainline;
refmain.ID = mydt.Key;
myref.MAIN = new REFMAIN[] { refmain };
}
myref.Serialize();
myref.SaveToFile(xmlfile);
}Решение задачи: «Заполнение XML по XSD»
textual
Листинг программы
private void CreateXML(Dictionary<uint, string> myDataList)
{
string name = "MyName"; // -> name
string action = "read"; // -> action
REF myref = new REF(); // root element
myref.name = name;
myref.action = action;
//mydate -> DATE
DateTime mydate = new System.DateTime(DateTime.Now.Year, 1, 1, 0, 0, 0, 0);
List<REFMAIN> list = new List<REFMAIN>();
foreach (var mydt in myDataList)
{
REFMAINMAIN_LINE refmainline = new REFMAINMAIN_LINE();
refmainline.MAIN_LINE = new REFMAINMAIN_LINEMAIN_LINE();
refmainline.MAIN_LINE.DATE = mydate;
refmainline.MAIN_LINE.COMMENT= mydt.Value;
REFMAIN refmain = new REFMAIN();
refmain.REFMAINMAIN_LINE = refmainline;
refmain.ID = mydt.Key;
list.Add(refmain);
}
myref.MAIN = list.ToArray();
myref.Serialize();
myref.SaveToFile(xmlfile);
}