2010-05-24 31 views
2

我正在嘗試從XSD文件讀取枚舉。該模式是如下從.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++; 
      } 
+0

好的,我解決了您的問題,但是使用XLinq添加了另一個答案,以防其他人來這裏想要使用這種解決方案。自您更新並修復原始帖子以來,我也刪除了原始答案。 – Domenic 2010-05-24 17:01:08

回答

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); 
} 
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. 
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,從ReadXmlSchemaLoadXmlDataSetGetXml,它工作。