Чтение типизированных объектов из XML с использованием известного XSD - PullRequest
29 голосов
/ 19 февраля 2010

У меня есть следующий (в качестве примера) XML-файл и XSD.

<?xml version="1.0" encoding="utf-8" ?>
<foo>
  <DateVal>2010-02-18T01:02:03</DateVal>
  <TimeVal>PT10H5M3S</TimeVal>
</foo>

и

version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="foo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="DateVal" type="xs:dateTime" />
        <xs:element name="TimeVal" type="xs:duration" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Тогда следующий код C #:

  static void Main(string[] args)
  {
     XmlDocument xd = new XmlDocument();
     XmlSchema xs;
     using (var fs = File.OpenRead(FilePath + "SimpleFields.xsd"))
     {
        xs = XmlSchema.Read(fs, null);
     }

     xd.Schemas.Add(xs);
     xd.Load((FilePath + "SimpleFields.xml"));
     xd.Validate(null);

     var el_root = xd.DocumentElement;

     var el_date = (XmlElement)el_root.SelectSingleNode("./DateVal");
     //WANTED: el_date.Value = 2010-02-18 01:02:03 (as a DateTime Object)
     //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)
     //ACTUAL: el_date.InnerText="PT10H5M3S"

     Console.WriteLine("DONE");
     Console.ReadLine();
  }

Как я могу прочитать данные как строго типизированные объекты?

Я буду использовать устройство WindowsMobile, но это не должно сильно влиять на ответ. (может быть .NET 2.0 или 3.5 ... Не уверен, поможет ли Sstem.Xml.Linq или нет)

Ответы [ 2 ]

54 голосов
/ 20 февраля 2010

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

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"
}

Это так просто! :-)

9 голосов
/ 20 февраля 2010

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

это класс 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"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...