Генерация XML с помощью xsd в VS2010 с использованием LINQ - PullRequest
2 голосов
/ 23 августа 2010

Я использовал много Linq2SQL и знаком с большинством концепций (вплоть до расширения ObjectContext, включая его), но что касается Linq2XML, я немного растерялся.

Теперь у меня есть потребностьчтобы создать какой-то сложный XML, и я хотел бы использовать простоту LINQ.

Ранее я использовал XMLDocuments и программно созданные элементы - я надеюсь, что смогу получить что-то более элегантное.

Мне дана сложная схема в виде 15 с лишним xsds - большинство из которых импортирует хотя бы еще один xsd (общие типы данных), а некоторые импортируют друг друга

Итак, у меня есть что-то вроде:

Файл 1..n

<xsd:schema targetNamespace="http://www.SomeCompany.com"  
    xmlns:SomeCompany="http://www.SomeCompany.com/datatypes_EA"  
    xmlns="http://www.SomeCompany.com" xmlns:dct="http://www.SomeCompany.com/DCTRequestdatatypes"  
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="unqualified">
    <xsd:import namespace="http://www.SomeCompany.com/datatypes_EA"
        schemaLocation="datatypes_EA.xsd" />
        <xsd:import namespace="http://www.SomeCompany.com/DCTRequestdatatypes"
        schemaLocation="DCTRequestdatatypes.xsd" />
    <xsd:element name="DCTRequest">
        <xsd:complexType>
            <blah which references types stored in datatypes_EA.xsd>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

и другой файл (DataTypes_EA.xsd), который содержит общие типы данных.

Iпришлось настроить <import> s для исправления проблем с путями, но VS2010 теперь отображает 0 ошибок (и ничто не подчеркивается в редакторе)

Различные файлы 1 ... n определяют xml, необходимый дляпоразить веб-сервис - как такового нет общегоroot (есть xsd для типа запроса 1, типа запроса 2 и т. д.)

Я нашел инструмент xsd.exe для генерации классов, но если я укажу его на схему для (скажем) типа запроса 1, Я получаю много предупреждений о проверке схемы, говоря, что он не может найти общие типы данных (например, не читает оператор импорта) и не может ничего сгенерировать.

В идеале, я хотел бы пропустить генерациюзанятия полностью, но примут его, если потребуется.

Короче, как мне узнать, где я пишу что-то вроде:

Dim Root as new DCTRequest with {.Property = "SomeValue"}
...
Dim ElementsWithSomething = A.SomeElementCollection.Where(function(x) x.PropertyName = "Something")
Dim FinalXML = A.Tostring (or serialize or whatever)

Я неправильно это подхожу?

Заранее спасибо за любую помощь

1 Ответ

1 голос
/ 24 августа 2010

Чтобы запустить xsd.exe, вы должны назвать его как

xsd.exe schema1.xsd schema2.xsd /c

Полагаю, вы можете выстроить здесь все свои схемы и получить все классы, сгенерированные одновременно.

Если у вас есть классы, вы не используете LINQ2XML, а вместо этого используете XmlSerializer для десериализации XML-файла в объекты. Затем вы используете обычные объекты LINQ2Object с результирующим графом объектов.

Редактировать: Поскольку это, похоже, не работает, последним средством может быть слияние файлов XSD вручную.

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