2012-06-25 208 views
3

我在獲取XmlSchema子元素的屬性時遇到問題。獲取子元素的所有屬性

有一個abstactElementconcreteElement,它擴大了abstractElement。 使用XmlSchemaComplexType.BaseXmlSchemaType獲得基地的屬性正常工作。 但使用XmlSchemaComplexType.Attributes獲取concreteElement的屬性不起作用。

這是我的示例XML的架構文件:

<xs:schema id="XMLSchema1" 
    targetNamespace="http://tempuri.org/XMLSchema1.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/XMLSchema1.xsd" 
    xmlns:mstns="http://tempuri.org/XMLSchema1.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 
    <xs:element name = "ConcreteElement" type="concreteElement" /> 

    <xs:complexType name="abstractElement"> 
     <xs:attribute name="aA1" type="xs:string" /> 
     <xs:attribute name="aA2" type="xs:string" /> 
     <xs:attribute name="aA3" type="xs:string" />  
    </xs:complexType> 

    <xs:complexType name="concreteElement"> 
     <xs:complexContent> 
      <xs:extension base="abstractElement"> 
       <xs:attribute name="cA1" type="xs:string"/> 
       <xs:attribute name="cA2" type="xs:string"/> 
       <xs:attribute name="cA3" type="xs:string"/> 
      </xs:extension>  
     </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

我想要得到的ConcreteElement(CA1,CA2,CA3)和它的基本元素(AA1,AA2,AA3的所有屬性的所有屬性)。

我的代碼看起來像這樣:

public Program() 
{ 
    XmlSchema xsd = 
      XmlSchema.Read(
       new StreamReader("/Path/To/My/Xsd/File.xsd"), 
       null); 

    var xss = new XmlSchemaSet(); 
    xss.Add(xsd); 
    xss.Compile(); 

    XmlSchemaElement xsdRoot = null; 
    /* Get the root element */ 
    foreach (DictionaryEntry curEle in xsd.Elements) 
    { 
     var xse = (XmlSchemaElement)curEle.Value; 
     xsdRoot = xse; 
     break; 
    } 

    List<XmlSchemaAttribute> lsAttributes = this.GetAllAttributes(
          xsdRoot.ElementSchemaType as XmlSchemaComplexType); 
    foreach (XmlSchemaAttribute curAtr in lsAttributes) 
    { 
     Console.WriteLine(curAtr.Name); 
    } 

    Console.ReadKey(); 
} 

這是我GetAllAttributes方法:

private List<XmlSchemaAttribute> GetAllAttributes(
    XmlSchemaComplexType comCon) 
{ 
    /* No Ancestor, no Attributes */ 
    if (comCon == null) 
    { 
     return new List<XmlSchemaAttribute>(); 
    } 

    /* Get attributs of the acestors */ 
    List<XmlSchemaAttribute> allAttributes = 
     this.GetAllAttributes(
      comCon.BaseXmlSchemaType as XmlSchemaComplexType); 

    /* Ad the attributes of the given element */ 
    allAttributes.AddRange(comCon.Attributes.Cast<XmlSchemaAttribute>()); 

    return allAttributes; 
} 

問候,

回答

2

最後的解決方案是使用屬性AttributeUses,它包含所有元素的屬性 ,即使是屬於祖先的屬性。

private List<XmlSchemaAttribute> GetAllAttributes(
    XmlSchemaComplexType comCon) 
{   
    List<XmlSchemaAttribute> allAttributes = new List<XmlSchemaAttribute>(); 

    /* Add the attributes of the given element */ 
    foreach (DictionaryEntry curAttriEntry in comCon.AttributeUses) 
    { 
     XmlSchemaAttribute curAttri = 
      curAttriEntry.Value as XmlSchemaAttribute; 

     if (curAttri != null) 
     { 
      allAttributes.Add(curAttri); 
     } 
    } 

    return allAttributes; 
}