我正在尝试解析自定义 XSD 以构建一个定义了自定义属性的元素列表。我在下面粘贴了我的 XSD 中的示例节点。就我而言,我正在尝试构建一个包含所有已标记为静态的元素(简单和复杂类型)的列表。示例 -
<xs:element name="ATestEnum">
<xs:annotation>
<xs:appinfo>
<ConfigurationMemberMetadata>
<Static>False</Static>
</ConfigurationMemberMetadata>
</xs:appinfo>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Sample1" />
<xs:enumeration value="Sample2" />
</xs:restriction>
</xs:simpleType>
</xs:element>
我只是想不出一种方法来查询元素“内部”以获得我需要的属性。我已经走到这一步了 -
var doc = XDocument.Load(schemaFileName);
foreach (var element in doc.Descendants(xs + "element"))
{
Console.WriteLine(element.Attribute("name").Value);
}
这为我提供了 xsd 中所有元素的列表,但没有我需要检查的特定属性 (ConfigurationMemberMetadata)。我看到了 element.Annotation(type) 方法,但如何转换它以提取我要查找的字段?
我还尝试使用 XmlTextReader 并读取架构、编译架构集并遍历元素,但这也无济于事。
有人能指出我正确的方向吗?我是 xml 解析的新手,非常感谢您的帮助!谢谢。
最佳答案
你必须使用这样的东西:
XmlReader reader = XmlReader.Create(@"D:\....\your-file.xsd");
XDocument doc = XDocument.Load(reader);
XmlNamespaceManager ns = new XmlNamespaceManager(reader.NameTable);
ns.AddNamespace("", "http://tempuri.org/XMLSchema.xsd");
XNamespace xs = "http://www.w3.org/2001/XMLSchema";
foreach (var element in doc.Descendants(xs + "element")) { Console.WriteLine(element.Attribute("name").Value); }
foreach (XElement element in (IEnumerable)doc.XPathEvaluate("//ConfigurationMemberMetadata")) { Console.WriteLine(element.Name); }
注释没有出现在信息集中,它们是其他东西。要获取您的元素,请使用 XPath。
需要注意的一件事是您与前缀相关联的 namespace 。通常,在 XSD 文件中,默认 namespace 与目标 namespace 相匹配,这就是我设置虚拟 namespace 的原因 - 更新以匹配您的 namespace 。如果您没有默认命名空间,只需将 uri 也设置为空字符串即可。
这是我在上面的代码中使用的 XSD:
<?xml version="1.0" encoding="utf-8" ?>
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="ATestEnum">
<xs:annotation>
<xs:appinfo>
<ConfigurationMemberMetadata>
<Static>False</Static>
</ConfigurationMemberMetadata>
</xs:appinfo>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Sample1"/>
<xs:enumeration value="Sample2"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
关于c# - 在 C# 中解析 Xsd 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9780275/