在Linq (c#)中处理xml:计数后代/元素并检查计数= X
本文关键字:后代 元素 检查 Linq xml 处理 | 更新日期: 2023-09-27 17:53:14
给定XML文档:
<Root xmlns="http://foo" xmlns:bar="http://bar">
<Child Name="one" bar:Type="type1" />
<Child Name="two" bar:Caption="captionvalue" />
</Root>
使用XElement根(具有元素root)执行以下操作的最有效方法是什么:
- 确保只有两个子元素作为后代
- 对于每个子元素中的每个属性,如果命名空间为http://bar,则调用BarFunction(attribute.value),否则调用NoBarFunction(attribute.value)
- 如果我需要根据他们的名字不同地处理孩子的每个属性(例如:用值填充一组变量)是属性上唯一的If -else选项。foreach (Attribute)块中的名称?
假设没有"http://bar"名称空间的属性实际上在一些默认名称空间中(而不是在http://foo中)与继承父名称空间的元素不同,如果不合格,我是否正确?
我:
IEnumerable<XElement> children = root.Elements("Child");
// How do I test the count? And get each Child
foreach (XAttribute attribute in child.Attributes())
{
if (attribute.Name.Namespace.ToString() == "http://bar")
{
BarFunction(attribute.Value);
}
else //Default Namespace
{
NoBarFunction(attribute.Value);
}
}
使用LINQ将是最有效的方法。比如(从记忆中):
IEnumerable<XElement> results = root.Elements("child").Where(el => el.Children.Count == 2)
然后对results
执行检查以查看名称空间是什么,然后对该/那些XElement执行方法。这也可以在LINQ中使用类似的语法来完成。
对于第3点,您可以使用switch
块,这可能更合适,尽管这取决于您对体系结构的决定。例如,如果元素是一组预定义的值,那么你也可以使用LINQ来填充你的变量。
API: Extensions。GetSchemaInfo
开箱即用,您想知道属性(或元素或…)是在哪个模式中声明的。
在'XML读取'角色中,这将是哪个模式验证了该节点。
在验证解析器术语中,此信息是PVSI (Post Validation Schema Infoset)的一部分。你可以通过调用
来获取该信息。public static void Validate(
this XDocument source,
XmlSchemaSet schemas,
ValidationEventHandler validationEventHandler,
bool addSchemaInfo
)
与addSchemaInfo
设置为true。
如果addSchemaInfo为true,该方法将使用模式验证后信息集(PSVI)填充XML树。
用PSVI填充XML树有两个步骤。
首先,向树中的所有节点添加注释,使您能够调用Extensions。GetSchemaInfo或Extensions。
其次,将XSD中定义的默认元素和属性添加到XML树中。通过调用GetSchemaInfo方法之一,您可以确定是否从XSD添加了特定的元素或属性作为默认元素或属性。