从XMLSchema中获取列名和类型



我在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>

我想从中得到的是一个Dictionary,其中每个条目都是"ColumnName"one_answers"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个元素的模式。现在我需要做的是深入研究<xs:complexType&gt-&gt<xs:element name="WbDT"&gt-&gt<xs:sequence>元素,并对其进行迭代以获得列名及其类型。

到目前为止,我使用的语法是:

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 上得到了一个空异常

我正在努力遵循以下微软文档:https://learn.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" />

您的问题实际上是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);
}
}

使用.net框架4.7.2和名称空间System.Xml.Schema

另一种选择

XmlDocument xml=新的XmlDocument((;xml。LoadXml(xmlString(;

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

最新更新