在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)执行以下操作的最有效方法是什么:

  1. 确保只有两个子元素作为后代
  2. 对于每个子元素中的每个属性,如果命名空间为http://bar,则调用BarFunction(attribute.value),否则调用NoBarFunction(attribute.value)
  3. 如果我需要根据他们的名字不同地处理孩子的每个属性(例如:用值填充一组变量)是属性上唯一的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 (c#)中处理xml:计数后代/元素并检查计数= X

使用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树有两个步骤。

  1. 首先,向树中的所有节点添加注释,使您能够调用Extensions。GetSchemaInfo或Extensions。

  2. 其次,将XSD中定义的默认元素和属性添加到XML树中。通过调用GetSchemaInfo方法之一,您可以确定是否从XSD添加了特定的元素或属性作为默认元素或属性。