Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从.XSD文件中提取枚举数据_C#_.net_Xml - Fatal编程技术网

C# 从.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

我正在尝试从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: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);