Вы можете использовать замечательные рекурсивные функции из SQL Server:
Пример таблицы:
CREATE TABLE Testdata
(
SomeID INT,
OtherID INT,
String VARCHAR(MAX)
)
INSERT Testdata SELECT 1, 9, '18,20,22'
INSERT Testdata SELECT 2, 8, '17,19'
INSERT Testdata SELECT 3, 7, '13,19,20'
INSERT Testdata SELECT 4, 6, ''
INSERT Testdata SELECT 9, 11, '1,2,3,4'
Запрос
;WITH tmp(SomeID, OtherID, DataItem, String) AS
(
SELECT
SomeID,
OtherID,
LEFT(String, CHARINDEX(',', String + ',') - 1),
STUFF(String, 1, CHARINDEX(',', String + ','), '')
FROM Testdata
UNION all
SELECT
SomeID,
OtherID,
LEFT(String, CHARINDEX(',', String + ',') - 1),
STUFF(String, 1, CHARINDEX(',', String + ','), '')
FROM tmp
WHERE
String > ''
)
SELECT
SomeID,
OtherID,
DataItem
FROM tmp
ORDER BY SomeID
-- OPTION (maxrecursion 0)
-- normally recursion is limited to 100. If you know you have very long
-- strings, uncomment the option
< hr> Выход
SomeID | OtherID | DataItem
--------+---------+----------
1 | 9 | 18
1 | 9 | 20
1 | 9 | 22
2 | 8 | 17
2 | 8 | 19
3 | 7 | 13
3 | 7 | 19
3 | 7 | 20
4 | 6 |
9 | 11 | 1
9 | 11 | 2
9 | 11 | 3
9 | 11 | 4
Да, используя xsd.exe
D:\temp>xsd test.xml
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'D:\temp\test.xsd'.
D:\temp>xsd test.xsd /classes
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'D:\temp\test.cs'.
Вы можете использовать xsd, как предложено Дарином.
В дополнение к этому рекомендуется отредактировать файл test.xsd для создания более разумной схемы.
type="xs:string"
можно изменить на type="xs:int"
для целочисленных значений minOccurs="0"
можно изменить на minOccurs="1"
, где требуется поле maxOccurs="unbounded"
, можно изменить на maxOccurs="1"
, где разрешен только один элемент
Вы могут создавать более продвинутые xsd-s, если вы хотите еще раз подтвердить свои данные, но это, по крайней мере, даст вам разумные типы данных в сгенерированном c #.
Вы должны рассмотреть svcutil ( svcutil question )
Оба xsd.exe и svcutil работают с файлом схемы XML (.xsd). Ваш XML должен соответствовать файлу схемы, который будет использоваться одним из этих двух инструментов.
Обратите внимание, что для этого существуют и другие сторонние инструменты.
Сначала я подумал, что Паштет Специальный был святым Граалем! Но потом я попробовал это, и мои волосы побледнели, как фильм Индианы Джонса.
Но теперь я использую http://xmltocsharp.azurewebsites.net/ , и теперь я как и раньше.
Вот отрезок того, что он сгенерировал:
namespace Xml2CSharp
{
[XmlRoot(ElementName="entry")]
public class Entry {
[XmlElement(ElementName="hybrisEntryID")]
public string HybrisEntryID { get; set; }
[XmlElement(ElementName="mapicsLineSequenceNumber")]
public string MapicsLineSequenceNumber { get; set; }
Если вы работаете над проектом .NET 4.5 в VS 2012 (или новее), вы можете просто вставить свой XML-файл в качестве классов.
EDIT > Paste Special > Paste XML As Classes
Чтобы преобразовать XML в класс C #:
Примечание: в полноте время, это приложение может быть заменено, но, скорее всего, будет другой инструмент, который делает то же самое.
Используйте синтаксис ниже для создания класса схемы из файла XSD.
C:\xsd C:\Test\test-Schema.xsd /classes /language:cs /out:C:\Test\
Я понимаю, что это довольно старый пост, и вы, вероятно, двинулись дальше.
Но у меня была такая же проблема, как и вы, поэтому я решил написать свою собственную программу.
Проблема с маршрутом «xml -> xsd ->» для меня заключалась в том, что он просто создал кусок кода, который был совершенно недостижим, и я закончил его.
Это никоим образом не элегантно, но он выполнил эту работу для меня.
Вы можете получить ее здесь: Пожалуйста, внесите предложения, если вам это нравится.