3

XmlSchema我在获取子元素的属性时遇到问题。

有一个abstactElement和一个concreteElement扩展了abstractElement. 使用 .获取基地的属性可以正常工作XmlSchemaComplexType.BaseXmlSchemaType。但是concreteElement使用 's 属性XmlSchemaComplexType.Attributes是行不通的。

这是我的示例 XML-Schema 文件:

<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;
} 

问候,

4

1 回答 1

2

最后的解决方案是使用 Property 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;
}
于 2012-07-09T09:09:38.253 回答