如何在 C# 中解析时从 XSD 中的基文件中选择 SimpleType
本文关键字:XSD 文件 SimpleType 选择 | 更新日期: 2023-09-27 18:33:07
我有一个名为base.xsd的文件,在这个文件中我有这样的结构:-
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:simpleType name="StringNotNull">
<xsd:restriction base="xsd:normalizedString">
<xsd:minLength value="1"/>
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="AssemblyTimeDimension">
<xsd:simpleContent>
<xsd:extension base="xsd:positiveInteger">
<xsd:attribute name="unitOfMeasure" type="AssemblyTimeUnitOfMeasure" use="required"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:simpleType name="AssemblyTimeUnitOfMeasure">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="minutes"/>
<xsd:enumeration value="hours"/>
<xsd:enumeration value="days"/>
<xsd:enumeration value="weeks"/>
<xsd:enumeration value="months"/>
<xsd:enumeration value="years"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
我有另一个文件,其中的结构是这样的:-
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:include schemaLocation="base.xsd"/>
<xsd:element name="BabyProducts">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="AlertType" type="StringNotNull" minOccurs="0"/>
<xsd:element name="AssemblyTime" type="AssemblyTimeDimension" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
我在字符串变量中 schemaTypeName.Name 元素。如何在 base.xsd 中找到具有此名称及其子标记的 SimpleType ?
如果您尝试解析/读取 XML,则可以使用 Linq XML。以下示例演示如何分析和访问元素/属性。您可能希望添加一些错误检查(空检查或有效值等)。您将在下面的第一次查找中对照您的 schemaTypeName.Name 与 a.Value 进行比较。
XDocument doc = XDocument.Load("base.xsd");
var element = doc.Descendants()
.FirstOrDefault(e => e.Attributes()
.Any(a => a.Name=="name" && a.Value == "StringNotNull")) as XElement;
var minLength = element.Descendants()
.FirstOrDefault(e => e.Name.LocalName == "minLength")
.Attribute("value").Value;
var maxLength = element.Descendants()
.FirstOrDefault(e => e.Name.LocalName == "maxLength")
.Attribute("value").Value;
对于架构验证,好的选择是使用实际的架构验证程序。