从.XSD文件中提取枚举数据

时间:2010-05-24 10:16:13

标签: 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: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>

我也尝试使用this,但我将列表项目计为零。以下是我正在使用的代码

DataSet _sR = new DataSet();
 _sR.ReadXmlSchema(assembly.GetManifestResourceStream("v1.xsd"));
    XmlDocument xDoc = new XmlDocument();
             xDoc.LoadXml(_sR.GetXml());
             XmlNamespaceManager xMan = new XmlNamespaceManager(xDoc.NameTable);
             xMan.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");

             XmlNodeList xNodeList = xDoc.SelectNodes(
                            "//xs:schema/xs:simpleType[@name='Type']/xs:restriction/xs:enumeration", xMan);

             string[] enumVal = new string[xNodeList.Count];
             int ctr = 0;
             foreach (XmlNode xNode in xNodeList)
             {
                enumVal[ctr] = xNode.Attributes["value"].Value;
                ctr++;
             }

3 个答案:

答案 0 :(得分:3)

您可以使用XmlSchema对象获取枚举值,该对象提供对xsd的所有元素的编程访问。

using System.Xml;
using System.Xml.Schema;


XmlSchema schema = XmlSchema.Read(XmlReader.Create("v1.xsd"), 
    new ValidationEventHandler(ValidationCallbackOne));
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(schema);
schemaSet.Compile();

IEnumerable<string> enumeratedValues = schema.Items.OfType<XmlSchemaSimpleType>()
    .Where(s => (s.Content is XmlSchemaSimpleTypeRestriction) 
        && s.Name == "Type")
    .SelectMany<XmlSchemaSimpleType, string>
        (c =>((XmlSchemaSimpleTypeRestriction)c.Content)
            .Facets.OfType<XmlSchemaEnumerationFacet>().Select(d=>d.Value));

// will output Op1, Op2, Op3...
foreach (string s in enumeratedValues)
{
    Console.WriteLine(s);
}

答案 1 :(得分:0)

这是一种使用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.

答案 2 :(得分:0)

我发现,问题在于你的中间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);

但是当我尝试使用来自DataSet ReadXmlSchema的{​​{1}}和LoadXml的中级DataSet时,不会工作。