Считайте типизированные объекты из XML использование известного XSD

Возможно, самое близкое, что вы можете сделать, это

static bool IntegerFunction<T>(T value) where T: struct

Не уверен, что вы могли бы сделать следующее

static bool IntegerFunction<T>(T value) where T: struct, IComparable
, IFormattable, IConvertible, IComparable<T>, IEquatable<T>

Для чего-то такого конкретного, почему бы просто не перегружать для каждого тип, список настолько короткий и, возможно, меньше памяти.

29
задан Steven_W 19 February 2010 в 08:25
поделиться

2 ответа

OK - нашел ответ, который искал.

это класс XmlConvert.

     var el_date = (XmlElement)el_root.SelectSingleNode("./DateVal");
     //WANTED: el_date.Value = 2010-02-18 01:02:03 (as a DateTime Object)
     var val_date = XmlConvert.ToDateTime(el_date.InnerText);
     //ACTUAL: el_date.InnerText="2010-02-18T01:02:03"

     var el_duration = (XmlElement)el_root.SelectSingleNode("./TimeVal");
     //WANTED: el_date.Value = 10 hours, 5 minutes, 3 seconds (as a TimeSpan Object)
     var val_duration = XmlConvert.ToTimeSpan(el_duration.InnerText);
     //ACTUAL: el_date.InnerText="PT10H5M3S"

Ответ Марка был верным с точки зрения чтения в целом строго типизированном классе, но в этом случае я хотел прочитать только один строго типизированный элемент / узел.

9
ответ дан Steven_W 20 November 2019 в 00:26
поделиться

Вам нужно сделать два шага:

1) Возьмите файл XML-схемы и запустите его через утилиту xsd.exe (которая поставляется с Windows SDK - она находится в C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\ или по аналогичному пути. Это может превратить XSD файл в класс C#:

xsd /c yourfile.xsd

В результате вы получите файл yourfile.cs, который содержит класс, представляющий эту XML схему.

2) Теперь, вооруженный этим классом C#, вы должны быть в состоянии просто десериализовать XML-файл в экземпляр вашего нового объекта:

XmlSerializer ser = new XmlSerializer(typeof(foo));

string filename = Path.Combine(FilePath, "SimpleFields.xml");

foo myFoo = ser.Deserialize(new FileStream(filename, FileMode.Open)) as foo;

if (myFoo != null)
{
   // do whatever you want with your "foo"
}

Вот так все просто! :-)

57
ответ дан 28 November 2019 в 01:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: