2011-02-17 65 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

相關問題