首页 > 解决方案 > 如何在 C# 中解析通用 XML 文件以在 SQL Server 数据库中创建表

问题描述

我有这个通用 XML 文件,我想解析它,以便可以根据 XML 数据创建一个 SQL 服务器表:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Student">
  <xs:complexType>
    <xs:sequence>
    <xs:element name="Id" type="xs:integer"/>
    <xs:element name="Name" type="xs:string"/>
    <xs:element name="City" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

我想恢复以下数据:

Student, 

Id / integer

Name / String

City / String

Student 将是表的名称,Id、Name 和 City 是列。我所需要的只是如何解析 XML 文件并恢复数据。

标签: c#xmlxsd

解决方案


您的 XML 文件是一个XML 模式定义 (XSD)文件,它正式描述了可扩展标记语言 (XML) 文档中的元素。 您可以将此类文件加载到XmlSchemaSet模式集合中,对其进行编译,然后查询由此定义的模式以获取您的主要元素名称及其属性。

假设您有一个xsdString包含问题中显示的 XSD 的字符串。然后你可以加载它,编译它,并打印出复杂的元素及其属性,如下所示:

// Load the xsdString into an XmlSchemaSet.
// If loading from a file use a StreamReader rather than a StringReader
XmlSchemaSet schemaSet = new XmlSchemaSet();
using (var reader = new StringReader(xsdString))
{
    schemaSet.Add(XmlSchema.Read(reader, null));
}

// Compile the schema
schemaSet.Compile();

// Iterate over the schemas
// Code adapted from https://docs.microsoft.com/en-us/dotnet/standard/data/xml/traversing-xml-schemas
foreach (XmlSchema schema in schemaSet.Schemas())
{
    // Iterate over the complex types in the schema
    foreach (XmlSchemaElement element in schema.Elements.Values)
    {
        var complexType = element.ElementSchemaType as XmlSchemaComplexType;
        if (complexType == null)
            continue;

        Console.WriteLine("Complex element: {0}", element.Name);

        // If the complex type has any attributes, get an enumerator
        // and write each attribute name to the console.
        if (complexType.AttributeUses.Count > 0)
        {
            var enumerator = complexType.AttributeUses.GetEnumerator();
            while (enumerator.MoveNext())
            {
                var attribute = (XmlSchemaAttribute)enumerator.Value;
                var name = attribute.Name;
                var type = attribute.AttributeSchemaType.TypeCode;

                Console.WriteLine("   Attribute {0}: {1}", name, type);
            }
        }

        // Get the sequence particle of the complex type.
        var sequence = complexType.ContentTypeParticle as XmlSchemaSequence;
        if (sequence != null)
        {
            // Iterate over each XmlSchemaElement in the Items collection.
            foreach (XmlSchemaElement childElement in sequence.Items)
            {
                var name = childElement.Name;
                var type = childElement.ElementSchemaType.TypeCode;

                Console.WriteLine("   Element {0}: {1}", name, type);
            }
        }
    }
}

哪个输出

Complex element: Student
   Element Id: Integer
   Element Name: String
   Element City: String

请注意,XSD 类型xs:integer对应于无界整数,不一定适合Int32or Int64

参考:

演示小提琴在这里


推荐阅读