在 XmlNode 数组中按名称查找值

Posted

技术标签:

【中文标题】在 XmlNode 数组中按名称查找值【英文标题】:Find value by Name in XmlNode Array 【发布时间】:2020-06-05 15:24:03 【问题描述】:

我有以下 XML:

<UserArea>
    <Property>
        <NameValue name="amperage" type="StringType">1</NameValue>
    </Property>
    <Property>
        <NameValue name="attachments" type="StringType">2</NameValue>
    </Property>
    <Property>
        <NameValue name="noOfBolts" type="StringType">3</NameValue>
    </Property>
    <Property>
        <NameValue name="boreSize" type="StringType">4</NameValue>
    </Property>
</UserArea>

我在XmlNode[] 中获取的这个 XML 并且我需要按名称列出的所有属性,我尝试了以下内容:

      var xmlNodeArray = (XmlNode[])item.UserArea; //get xmlNode Array 
      var attachments = xmlNodeArray.FirstOrDefault(x => x.Name == "attachments")?.InnerText; //Not working, always returning null value
      foreach (var xmlNode in xmlNodeArray)
      
           var val = xmlNode["attachments"]?.InnerText; // Not working
           var data = xmlNode.InnerText; // working but need to looping
      

我有大约 250 个属性元素,所以我不想在这里使用 foreach

【问题讨论】:

【参考方案1】:

您可以使用Xml.Linq 轻松完成此操作。将您的 xml 解析为 XDocument,然后通过 Root 后代并获取第一个元素的值,其 name 属性等于 attachments

var document = XDocument.Parse(xml);
var result =
    document.Root?.Descendants()
        .FirstOrDefault(e => e.HasAttributes && e.Attribute("name")?.Value == "attachments")?.Value ??
        string.Empty;

【讨论】:

【参考方案2】:

您始终可以使用 XPath 选择节点

XmlNodeList nodes = userAreaNode.SelectNodes("//Property/NameValue[@name='attachments']");

【讨论】:

它应该是 //Property/NameValue[@name='attachments'] 因为 name 属性在 NameValue 元素上。 还要补充一点,如果你能保证每个 NameValue 永远只有一个实例,你可以使用 SelectSingleNode 代替返回单个 XmlNode。

以上是关于在 XmlNode 数组中按名称查找值的主要内容,如果未能解决你的问题,请参考以下文章

javascript在嵌套对象/数组中按值查找

在 Visual Studio Code 中按名称查找文件

如何在pyqt中按名称查找对象?

在flex中按名称查找后代子项

在用户表中按名称查找列

csharp 在WPF VisualTree中按名称查找控件