Как преобразовать это определение XML в класс C # - PullRequest
2 голосов
/ 15 ноября 2010

Существует ли «стандартный» способ преобразования чего-то подобного в набор классов C #?

<!DOCTYPE MESSAGES [
<!ELEMENT MESSAGES (MSG*)>
<!ELEMENT MSG (TO+,BODY,MSG_ID,BILLING)>
<!ATTLIST MSG TYPE (CONTENT|LOGO|RINGTONE|PICTURE|OTAPUSH|BINFWD|LONGSMS|2DCODE) #REQUIRED>
<!ELEMENT TO (#PCDATA)>
<!ATTLIST TO PROVID (1|2|3|5|6|7) #IMPLIED >
<!ATTLIST TO TYPE (NPM|EMS) #IMPLIED>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT MSG_ID (#PCDATA)>
<!ELEMENT BILLING (#PCDATA)>
<!ELEMENT DELIVERY (#PCDATA)>
<!ELEMENT EXPDATE (#PCDATA)>
]>

У меня есть еще немного информации, но я был бы очень признателен за способ преобразования ELEMENT и ATTLIST в C #.

Ответы [ 3 ]

3 голосов
/ 15 ноября 2010

Вы хотите создать экземпляр этого класса из этих данных или определить определение класса из этих данных? В последнем случае вы можете использовать генератор XSD to C #, чтобы получить определение класса, в котором будет храниться эта информация. Для первых ... это сложнее. Смотри ниже.

Эти данные находятся внутри элемента CDATA?

Если это так, преобразование этого в экземпляр класса C # может быть немного сложнее. Если нет, то на самом деле это довольно просто.

Посмотрите на LINQ-to-XML: http://msdn.microsoft.com/en-us/library/bb387061.aspx

Я использовал LINQ to XML для прямого разбора XML-файлов на классы следующим образом:

List<Parameter> tempList = (from param in x.Descendants("Parameter")
                              select new Parameter
                              {
                                  Name = param.Attribute("Name").Value,
                                  Value = param.Attribute("Value").Value,
                                  Run = Convert.ToBoolean(param.Attribute("Run").Value),
                                  Number = (int?) param.Attribute("Number"),
                                  Directory = param.Attribute("Directory").Value,
                                  Filename = (string)param.Attribute("Filename") ?? "None",
                                  Source = (string)param.Attribute("Source") ?? "None",
                                  FileTypes = (string)param.Attribute("FileTypes") ?? "None"
                              }).ToList();

X здесь XDocument, Parameter - класс с членами Name, Value, Run и т. Д. x.Descendants возвращает вам дочерние элементы корневого узла, где они являются узлом с именем Parameter Вы можете получить доступ к значениям атрибутов и установить равные им переменные-члены. Таким образом, вы получите список классов, представляющих все элементы определенного вида в вашем XML-файле, а затем сможете тратить меньше времени на разбор и больше времени на то, чтобы быть удивительным.

1 голос
/ 15 ноября 2010

Если вы конвертируете DTD в схему XSD с помощью этого инструмента w3c , вы можете использовать xsd.exe или Генератор примеров XML для создания классов .

1 голос
/ 15 ноября 2010

Если вы можете получить этот DTD в виде файла XSD, то вам следует взглянуть на инструмент, поставляемый с .Net, XSD.Exe, который будет в вашей папке Framework.

Я думаю, что формат будет

XSD.exe /C myXsd.xsd

Вот страница MSDN для инструмента: http://msdn.microsoft.com/en-us/library/x6c1kb0s%28VS.71%29.aspx

Но в основном он создает классы на основе определения схемы.

...