我正在尝试从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 :(得分: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
时,不会工作。