从模式确定元素和属性的基本类型

ElG*_*nde 1 xml vb.net xsd linq-to-xml

我已经给出了元素或属性的本地名称以及文档的架构。确定元素或属性的基本数据类型的最简单方法是什么。我所说的基本数据类型是指 xs:string、xs:date 等(xml 模式的内置数据类型。)

我面临的问题之一是元素类型很少成为基本的内置类型之一。99% 的时间它是一个复杂类型,50% 的时间引用另一个复杂类型,另一个复杂类型引用另一个复杂类型等等。

此模式的一个简单示例:我想找到 Employee/Person/Name/LastName 的基本类型(确定 LastName 是 xs:normalizedString)。在架构 Employee 中定义为 xs:element 和 type="bns:EmployeeType"

EmplyeeType 定义了一个 Person 元素,但它是“PersonType”类型,然后 Name in person 是 NameType,这是一个复杂类型,它扩展了 GeneralName 类型,即 BasicNameType 类型,该类型最终定义了 LastName 类型,其类型为“LastNameType”,然后在。还有定义等。

我目前正在使用 linq-to-xml 编写一个解析器来解决这个问题,但这并不容易或漂亮。我已经搜索了其他解决方案,但没有找到任何解决方案,但我完全承认我对 XML/模式/XPath 的无知。

有没有一种简单的方法来获取元素的基本类型?

Mar*_*nen 5

.NET 框架具有架构对象模型 (SOM),并且在使用 XmlReader 进行验证时或在验证 System.Xml.XmlDocument 或 System.Xml.Linq.XDocument 之后,有访问架构类型的挂钩。以下示例展示了如何验证 System.Xml.Linq.XDocument 以及如何访问架构信息:

    Dim doc As XDocument = XDocument.Load("..\..\XMLFile1.xml")
Dim schemaSet As New XmlSchemaSet()
schemaSet.Add(Nothing, "..\..\XMLFile1.xsd")

doc.Validate(schemaSet, Nothing, True)

For Each leafElement As XElement In doc.Descendants().Where(Function(d) Not (d.Elements().Any()))
    Console.WriteLine("Element named {0} has type {1}", leafElement.Name, DirectCast(leafElement.GetSchemaInfo().SchemaType, XmlSchemaSimpleType).Datatype.TypeCode)

Next
Run Code Online (Sandbox Code Playgroud)

随着 XML 文件被

<?xml version="1.0" encoding="utf-8" ?>
<persons>
  <person>
    <last-name>  Watson  </last-name>
    <foo>false</foo>
  </person>
</persons>
Run Code Online (Sandbox Code Playgroud)

模式是

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="persons">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="person" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="last-name" type="xs:normalizedString" />
              <xs:element name="foo" type="xs:boolean"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

样本输出

Element named last-name has type NormalizedString
Element named foo has type Boolean
Run Code Online (Sandbox Code Playgroud)

因此,请浏览 MSDN 上或本地 VS 文档中的 SOM 文档,您应该能够通过这种方式找到信息。