【问题标题】:Get column names and types out of XMLSchema从 XMLSchema 中获取列名和类型
【发布时间】:2018-12-10 20:34:13
【问题描述】:

我在 c# 中工作,试图从 xml 模式中提取列名及其类型。这是我收到的架构:

<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="WbDT" msdata:UseCurrentLocale="true">
<xs:complexType>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
    <xs:element name="WbDT">
        <xs:complexType>
        <xs:sequence>
            <xs:element name="TranslateNo" type="xs:int" minOccurs="0" />
            <xs:element name="EngWord" type="xs:string" minOccurs="0" />
            <xs:element name="LanguageCd" type="xs:string" minOccurs="0" />
            <xs:element name="TranslateWord" type="xs:string" minOccurs="0" />
            <xs:element name="UpdateDTS" type="xs:dateTime" minOccurs="0" />
            <xs:element name="UpdateBy" type="xs:string" minOccurs="0" />
        </xs:sequence>
        </xs:complexType>
    </xs:element>
    </xs:choice>
</xs:complexType>
</xs:element>

我想从中得到一个字典,其中每个条目都是“ColumnName”、“ColumnType”。

我在语法方面有点挣扎,这是我目前所掌握的:

var xml = result.WbDT;
XmlSchemaSet schemaSet = new XmlSchemaSet();
string xmlheader = "<?xml version='1.0' encoding='utf-8'?>" + System.Environment.NewLine;
string allxml = xmlheader + xml.Any[0].ToString();
schemaSet.Add("", XmlReader.Create(new StringReader(allxml)));
schemaSet.Compile();

XmlSchema customerSchema = null;
foreach (XmlSchema schema in schemaSet.Schemas())
{
    customerSchema = schema;
}

foreach (XmlSchemaElement element in customerSchema.Elements.Values)
{
    Console.WriteLine("Element: {0}", element.Name);

到目前为止一切顺利,我现在有一个包含 1 个元素的架构。现在我需要做的是深入研究 -> -> 元素并对其进行迭代以获取列名及其类型。

目前我使用的语法是:

XmlSchemaComplexType complexType = element.ElementSchemaType as XmlSchemaComplexType;
XmlSchemaSequence sequence = complexType.ContentTypeParticle as XmlSchemaSequence;

//// Iterate over each XmlSchemaElement in the Items collection.
foreach (XmlSchemaElement childElement in sequence.Items)
{
    Console.WriteLine("Element: {0}", childElement.Name);
}

但是当我尝试运行此代码时,我在 sequence.items 上得到一个空异常

我正在尝试遵循此 Microsoft 文档:https://docs.microsoft.com/en-us/dotnet/standard/data/xml/traversing-xml-schemas

我很确定问题是我的 xml 的结构比示例中的结构更深,

示例 xml

<xs:element name="Customer">  
    <xs:complexType>  
        <xs:sequence>  
            <xs:element name="FirstName" type="xs:string" />

我的 xml

<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="WbDT" msdata:UseCurrentLocale="true">
<xs:complexType>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
    <xs:element name="WbDT">
        <xs:complexType>
        <xs:sequence>
            <xs:element name="TranslateNo" type="xs:int" minOccurs="0" />

【问题讨论】:

    标签: c# xml .net-core xml-parsing xml-schema-collection


    【解决方案1】:

    您的问题确实是您的 XML 比您所遵循的示例具有更深的层次结构。你只需要添加一些额外的步骤来处理它:

    foreach (XmlSchemaElement element in customerSchema.Elements.Values)
    {
        Console.WriteLine("Element: {0}", element.Name);
        XmlSchemaComplexType complexType = element.ElementSchemaType as XmlSchemaComplexType;
        XmlSchemaChoice choice = complexType.ContentTypeParticle as XmlSchemaChoice;
        XmlSchemaElement outerElement = choice.Items.Cast<XmlSchemaElement>().First();
        XmlSchemaComplexType innerComplexType = outerElement.ElementSchemaType as XmlSchemaComplexType;
        XmlSchemaSequence xmlSchemaSequence = innerComplexType.ContentTypeParticle as XmlSchemaSequence;
    
        //// Iterate over each XmlSchemaElement in the Items collection.
        foreach (XmlSchemaElement childElement in xmlSchemaSequence.Items)
        {
            Console.WriteLine("Element: {0}", childElement.Name);
        }
    }
    

    【讨论】:

      【解决方案2】:

      使用 .net framework 4.7.2 和命名空间 System.Xml.Schema

      另一种选择

      XmlDocument xml = new XmlDocument(); xml.LoadXml(xmlString);

              XmlNodeList xnList = xml1.SelectNodes("/root/table[@name='Role']");
              foreach (XmlNode xn in xnList)
              {
                  string colName = xn["column"].InnerText;
      
              }
      

      【讨论】:

        猜你喜欢
        • 2012-06-16
        • 1970-01-01
        • 1970-01-01
        • 2016-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多