2012-03-20 52 views
3

我想解析一個自定義XSD來構建定義了自定義屬性的元素列表。我從下面的XSD粘貼了一個示例節點。在我的情況下,我試圖建立一個已被標記爲靜態的所有元素(簡單和複雜類型)的列表。樣本 -解析Cs中屬性的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解析,並會非常感謝您的幫助!謝謝。

回答

4

你必須使用這樣的事情:

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。

需要注意的一件事是與前綴關聯的名稱空間。通常,在XSD文件中,默認名稱空間與目標名稱空間相匹配,這就是爲什麼我設置了一個虛擬名稱空間 - 更新以匹配您的名稱空間。如果你沒有默認的命名空間,只需將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> 
2

製作使用XPath查詢來選擇只查找你有興趣(「靜態」的節點)的節點。

這裏是如何做到這一點的好例子:http://support.microsoft.com/kb/308333

如果您需要練習使用XPath,用這種「測試平臺」來熟悉它的語法:http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm

使用示例XML,這Xpath查詢將查找所有「靜態」節點:

/xml/xs:element/xs:annotation/xs:appinfo/ConfigurationMemberMetadata/Static