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

Xml 从模式中确定元素和属性的基本类型,xml,vb.net,xsd,linq-to-xml,Xml,Vb.net,Xsd,Linq To Xml,我已经给出了元素或属性的本地名称以及文档的模式。确定元素或属性的基本数据类型的最简单方法是什么。基本数据类型是指xs:string、xs:date等xml模式的内置数据类型 我面临的一个问题是,elements类型很少成为基本内置类型之一。99%的时间是一种复杂类型,50%的时间是指另一种复杂类型,而另一种复杂类型是指另一种复杂类型,依此类推 这个模式的一个简单示例:我想找到Employee/Person/Name/LastName的基本类型,确定LastName是xs:normalizedSt

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

我面临的一个问题是,elements类型很少成为基本内置类型之一。99%的时间是一种复杂类型,50%的时间是指另一种复杂类型,而另一种复杂类型是指另一种复杂类型,依此类推

这个模式的一个简单示例:我想找到Employee/Person/Name/LastName的基本类型,确定LastName是xs:normalizedString。 在模式中,Employee被定义为xs:element,type=bns:EmployeeType

EmployeType定义了一个Person元素,但它是PersonType类型,然后Person中的Name是NameType,它是一个复杂类型,扩展了BasicNameType类型的GeneralName类型,该类型最终定义了LastName类型,即LastNameType类型,并继续定义。还有定义等

我目前正在编写一个使用linq到xml的解析器来实现这一点,但这并不容易。我已经搜索了其他解决方案,但没有找到任何解决方案,但我完全承认我对XML/schema/XPath一无所知


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

不要试图用手来做这件事

我不熟悉Linq,所以可能还有其他方法可以做到这一点,但有一种方法是使用支持模式的XSLT或XQuery。如果您使用支持模式的XSLT或XQuery处理器处理经过验证的文档,那么您将能够执行以下测试

if (. instanceof attribute(*, xs:normalizedString)) ...

如果上下文节点是根据管理类型为xs:normalizedString的属性声明验证的属性节点,则为true。

不要尝试手动执行此操作

我不熟悉Linq,所以可能还有其他方法可以做到这一点,但有一种方法是使用支持模式的XSLT或XQuery。如果您使用支持模式的XSLT或XQuery处理器处理经过验证的文档,那么您将能够执行以下测试

if (. instanceof attribute(*, xs:normalizedString)) ...
如果上下文节点是根据管理类型为xs:normalizedString的属性声明进行验证的属性节点,则为true。

在使用XmlReader进行验证时或在验证System.Xml.XmlDocument或System.Xml.Linq.XDocument后,.NET framework有一个钩子,可以访问架构类型。下面是一个示例,演示如何验证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
当XML文件

<?xml version="1.0" encoding="utf-8" ?>
<persons>
  <person>
    <last-name>  Watson  </last-name>
    <foo>false</foo>
  </person>
</persons>
因此,在MSDN或本地VS文档中浏览SOM文档,您应该能够通过这种方式找到信息。

在使用XmlReader验证时或在验证System.Xml.XmlDocument或System.Xml.Linq.XDocument后,.NET framework有一个钩子,可以访问模式类型。下面是一个示例,演示如何验证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
当XML文件

<?xml version="1.0" encoding="utf-8" ?>
<persons>
  <person>
    <last-name>  Watson  </last-name>
    <foo>false</foo>
  </person>
</persons>

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

谢谢。我接受了另一个答案,因为1。正是它让我走上了正确的道路。2.直到我弄明白了,我才看到你的答案。虽然我认为你的回答更完整,关于我的具体问题。谢谢。我接受了另一个答案,因为1。正是它让我走上了正确的道路。2.直到我弄明白了,我才看到你的答案。虽然我认为你的回答更完整关于我的具体问题。