gpt4 book ai didi

c# - 获取子元素的所有属性

转载 作者:行者123 更新时间:2023-11-30 17:11:50 26 4
gpt4 key购买 nike

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

有一个abstactElement 和一个扩展abstractElementconcreteElement。使用 XmlSchemaComplexType.BaseXmlSchemaType 可以很好地获取基的属性。但是使用 XmlSchemaComplexType.Attributes 获取 concreteElement 的属性不起作用。

这是我的示例 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;
}

问候,

最佳答案

最后的解决方案是使用属性 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;
}

关于c# - 获取子元素的所有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11186794/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com