Как разобрать файл XSD - PullRequest
3 голосов
/ 16 июля 2010

Я пишу инструмент генерации кода, который будет принимать XSD-файл, сгенерированный из генератора наборов данных Visual Studio, и создавать собственный класс для каждого столбца в каждой таблице. Я уже понимаю, как реализовать IVsSingleFileGenerator для генерации кода и как превратить этот генератор одного файла в многофайловый генератор . Однако, кажется, шаг, с которым у меня больше всего проблем, должен быть самым простым. Я никогда прежде не работал с XML или XML-схемами, и я понятия не имею, как правильно перебирать XSD-файл и считывать имена и типы столбцов, чтобы я мог построить свой код.

Любая рекомендация по обучению чтению XSD-файла? Также любые рекомендации о том, как извлечь каждый xs:element, представляющий столбец, и прочитать его свойства msprop:Generator_UserColumnName, type и msprop:Generator_ColumnPropNameInTable из каждого элемента.

Ответы [ 5 ]

9 голосов
/ 16 июля 2010

Вы захотите создать XmlSchemaSet, прочитать схему, а затем скомпилировать ее для создания информационного набора.Как только вы это сделаете, вы можете начать итерацию по документу

XmlSchemaElement root = _schema.Items[0] as XmlSchemaElement;
XmlSchemaSequence children = ((XmlSchemaComplexType)root.ElementSchemaType).ContentTypeParticle as XmlSchemaSequence;
foreach(XmlSchemaObject child in children.Items.OfType<XmlSchemaElement>()) {
    XmlSchemaComplexType type = child.ElementSchemaType as XmlSchemaComplexType;
    if(type == null) {
        // It's a simple type, no sub-elements.
    } else {
        if(type.Attributes.Count > 0) {
            // Handle declared attributes -- use type.AttributeUsers for inherited ones
        }
        XmlSchemaSequence grandchildren = type.ContentTypeParticle as XmlSchemaSequence;
        if(grandchildren != null) {
            foreach(XmlSchemaObject xso in grandchildren.Items) {
                if(xso.GetType().Equals(typeof(XmlSchemaElement))) {
                    // Do something with an element.
                } else if(xso.GetType().Equals(typeof(XmlSchemaSequence))) {
                    // Iterate across the sequence.
                } else if(xso.GetType().Equals(typeof(XmlSchemaAny))) {
                    // Good luck with this one!
                } else if(xso.GetType().Equals(typeof(XmlSchemaChoice))) {
                    foreach(XmlSchemaObject o in ((XmlSchemaChoice)xso).Items) {
                        // Rinse, repeat...
                    }
                }
            }
        }
    }
}

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

6 голосов
/ 16 июля 2010

Как говорит btlog, XSD должны анализироваться как файлы XML. C # обеспечивает функциональность для этого.

Учебник по XPath: http://www.w3schools.com/xpath/default.asp
XQuery Tutorial: http://www.w3schools.com/xquery/default.asp
Случайный C # XmlDocument учебник: http://www.codeproject.com/KB/cpp/myXPath.aspx

В C # XPath / XQuery используются через XmlDocument. В частности, через звонки типа SelectSingleNode и SelectNodes.

Я рекомендую XmlDocument сверх XmlTextReader, если ваша цель - извлечь определенные куски данных. Если вы предпочитаете читать его построчно, XmlTextReader более уместно.

Обновление: Для тех, кто заинтересован в использовании Linq для запроса XML, .Net 4.0 представил XDocument в качестве альтернативы XmlDocument. См. Обсуждение в XDocument или XmlDocument .

2 голосов
/ 16 июля 2010

Вы можете просто загрузить его в XmlDocument. Xsd является действительным Xml, поэтому, если вы знакомы с этим типом, он довольно прост. Альтернативно XmlTextReader.

EDIT:

При быстром поиске существует объект System.Xml.Schema.XmlSchema, представляющий схему, которая, скорее всего, более применима. http://msdn.microsoft.com/en-us/library/system.xml.schema.xmlschema.aspx имеет хороший пример использования этого класса.

0 голосов
/ 16 июля 2010

Точно так же, как вы знаете, Visual Studio включает в себя инструмент под названием XSD, который уже будет принимать файл XSD и генерировать классы для C # или VB.NET: http://msdn.microsoft.com/en-us/library/x6c1kb0s.aspx

0 голосов
/ 16 июля 2010

Вот пример того, как получить отсортированный список табличных адаптеров из сгенерированного файла XSD. XML отличается в зависимости от того, является ли набор данных частью веб-приложения или веб-сайта. Вам нужно будет прочитать файл XSD, чтобы точно определить, что вы хотите прочитать. Надеюсь, это поможет вам.

Dim XMLDoc As New System.Xml.XmlDocument

XMLDoc.Load("MyDataset.xsd")
Dim oSortedTableAdapters As New Collections.Generic.SortedDictionary(Of String, Xml.XmlElement)

Const WebApplication As Boolean = False

Dim TableAdapters = XMLDoc.GetElementsByTagName("TableAdapter")
For Each TableAdapter As Xml.XmlElement In TableAdapters
    If WebApplication Then
        'pre-compiled way'
        oSortedTableAdapters.Add(TableAdapter.Attributes("GeneratorDataComponentClassName").Value, TableAdapter)
    Else
        'dynamic compiled way'
        oSortedTableAdapters.Add(TableAdapter.Attributes("Name").Value, TableAdapter)
    End If
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...