我正在编写一个代码生成工具,它将接收从Visual Studio的数据集生成器生成的XSD文件,并为每个表中的每个列创建一个自定义类。我已经了解如何实现IVsSingleFileGenerator
来生成代码以及如何将单个文件生成器转换为multi-file generator。然而,似乎我最麻烦的一步是应该是最简单的一步。我之前从未真正使用过XML或XML-Schema,我也不知道迭代XSD文件并读出列名和类型的正确方法是什么,以便我可以构建我的代码。
有关如何读取XSD文件的教程的任何建议?还有关于如何拉出表示列的每个xs:element
并从每个元素中读取其msprop:Generator_UserColumnName
,type
和msprop:Generator_ColumnPropNameInTable
属性的任何建议。
答案 0 :(得分:9)
您需要创建一个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...
}
}
}
}
}
}
显然你会想把所有的子处理东西都放在一个单独的方法中并递归调用它,但这应该会向你展示一般的流程。
答案 1 :(得分:6)
正如btlog所说,XSD应该被解析为XML文件。 C#确实为此提供了功能。
XPath教程:http://www.w3schools.com/xpath/default.asp
XQuery教程: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 or XmlDocument上的讨论。
答案 2 :(得分:2)
您可以将其加载到XmlDocument中。 Xsd是有效的Xml,所以如果你熟悉这种类型,那就很简单了。改变XmlTextReader。
编辑:
快速搜索有一个System.Xml.Schema.XmlSchema对象,它表示一个架构,它很可能更适用。 http://msdn.microsoft.com/en-us/library/system.xml.schema.xmlschema.aspx有一个使用此类的好例子。
答案 3 :(得分:0)
以下是如何从生成的XSD文件中获取tableadapters的排序列表的示例。 XML的不同取决于数据集是Web应用程序还是Web站点的一部分。您需要通读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
答案 4 :(得分:0)
您也知道,Visual Studio包含一个名为XSD的工具,该工具已经采用XSD文件并为C#或VB.NET生成类:http://msdn.microsoft.com/en-us/library/x6c1kb0s.aspx