2011-02-17 60 views
0

我给出了文档的元素或属性的本地名称和模式。确定元素或属性的基本数据类型的最简单方法是什么?通过基本的数据类型,我的意思是xs:string,xs:date等(xml模式的内置数据类型)。从模式确定元素和属性的基本类型

我面对的问题之一是元素类型很少是基本内置类型。 99%的时间是复杂类型,50%的时间是指另一种复杂类型,指的是另一种复杂类型等等。

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

EmplyeeType定义了一个Person元素,但它是类型“PersonType”,然后Name是一个复杂类型的NameType扩展类型为BasicNameType的GeneralName类型,并且该类型最终定义LastName类型为“LastNameType”的on和on。还有定义等

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

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

回答

1

请勿尝试手动完成此操作。

我对Linq并不熟悉,所以可能有其他方法来做到这一点,但一种方法是使用模式感知XSLT或XQuery。如果使用模式感知的XSLT或XQuery处理器处理您的验证文件,那么你就可以做测试,如

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

这是真的,如果上下文节点是这是对一个属性声明其经过验证的属性节点控制类型是xs:normalizedString。

4

在.NET框架具有schema object model (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 

随着XML文件是

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

和架构是

<?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> 

该样本输出

Element named last-name has type NormalizedString 
Element named foo has type Boolean 

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

+0

谢谢。我接受了另一个答案,因为1.这使我走上了正确的道路。在我想清楚之前,我没有看到你的答案。虽然我认为你的回答在我的具体问题上更加完整。 – ElGringoGrande 2011-02-17 18:43:40