gpt4 book ai didi

c# - 在 C# 中解析 Xsd 的属性

转载 作者:行者123 更新时间:2023-11-30 14:37:01 24 4
gpt4 key购买 nike

我正在尝试解析自定义 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com