C# 从.XSD文件中提取枚举数据
我正在尝试从XSD文件读取枚举。模式如下C# 从.XSD文件中提取枚举数据,c#,.net,xml,C#,.net,Xml,我正在尝试从XSD文件读取枚举。模式如下 <xs:schema id="v1.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="unqualified" elementFormDefault="qualified" msdata:IsDataSet="true"> <xs:si
<xs:schema id="v1.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="unqualified" elementFormDefault="qualified" msdata:IsDataSet="true">
<xs:simpleType name="Type">
<xs:restriction base="xs:string">
<xs:enumeration value="Op1" />
<xs:enumeration value="Op2" />
<xs:enumeration value="Op3" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
您可以使用XmlSchema对象获取枚举值,该对象提供对xsd所有元素的编程访问 using System.Xml; using System.Xml.Schema; 使用System.Xml; 使用System.Xml.Schema;
XmlSchema=XmlSchema.Read(XmlReader.Create(“v1.xsd”),
新的ValidationEventHandler(ValidationCallbackOne));
XmlSchemaSet schemaSet=新的XmlSchemaSet();
schemaSet.Add(schema);
schemaSet.Compile();
IEnumerable enumeratedValues=schema.Items.OfType()
。其中(s=>(s.Content是XmlSchemaSimpleTypeRestriction)
&&美国名称==“类型”)
.SelectMany
(c=>((XmlSchemaSimpleTypeRestriction)c.Content)
.Facets.OfType().Select(d=>d.Value));
//将输出Op1、Op2、Op3。。。
foreach(枚举值中的字符串s)
{
控制台。写入线(s);
}
这里有一种使用XLinq的方法,IMO更简单:
XDocument xDoc = XDocument.Load(assembly.GetManifestResourceStream("v1.xsd"));
XNamespace xs = "http://www.w3.org/2001/XMLSchema";
var enums = xDoc.Descendants(xs + "enumeration");
Console.WriteLine(enums.Count()); // Tested, outputs 3.
我发现问题在于中间的
DataSet
步骤。也就是说,以下代码起作用:
var xDoc = new XmlDocument();
xDoc.Load(assembly.GetManifestResourceStream("v1.xsd"));
var xMan = new XmlNamespaceManager(xDoc.NameTable);
xMan.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
var xNodeList = xDoc.SelectNodes("//xs:schema/xs:simpleType[@name='Type']/xs:restriction/xs:enumeration", xMan);
Console.WriteLine(xNodeList.Count);
但是,当我尝试使用中间
数据集时,从数据集的GetXml
使用ReadXmlSchema
和LoadXml
,它不起作用。好的,我解决了您的问题,但使用XLinq添加了另一个答案,以防其他人想使用这种解决方案。我也删除了我原来的答案,因为你更新并修复了你原来的帖子。
XDocument xDoc = XDocument.Load(assembly.GetManifestResourceStream("v1.xsd"));
XNamespace xs = "http://www.w3.org/2001/XMLSchema";
var enums = xDoc.Descendants(xs + "enumeration");
Console.WriteLine(enums.Count()); // Tested, outputs 3.
var xDoc = new XmlDocument();
xDoc.Load(assembly.GetManifestResourceStream("v1.xsd"));
var xMan = new XmlNamespaceManager(xDoc.NameTable);
xMan.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
var xNodeList = xDoc.SelectNodes("//xs:schema/xs:simpleType[@name='Type']/xs:restriction/xs:enumeration", xMan);
Console.WriteLine(xNodeList.Count);