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

标签 c# attributes xsd element

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

相关文章:

c# - 为什么 Entity Framework 会生成缓慢的过度设计的 SQL?

android - 以编程方式获取样式化属性的名称

java - Pentaho Web 服务查找无法加载我的 wsdl

xml - 错误 : It was detected that X is in namespace Y, 但此命名空间中的组件无法从架构文档中引用

c# - 控制台应用程序宿主wcf服务交互

c# - .NET WebApi 中的服务器传输/重定向

c# - 指定如何序列化我的对象(如果它在列表中)

c++ - C++和clang打包的属性

asp.net - 从 telerik 控件中删除默认内联样式

绑定(bind)到前缀的XML模式导入-vs-命名空间