选择包含某个属性的所有XML节点

本文关键字:XML 节点 包含某 属性 选择 | 更新日期: 2023-09-27 18:08:50

我必须选择包含具有特定名称的属性的所有节点。

这是我目前不工作的方法。

public List<string> RetrieveValuesForAttribute(string attributeName)
{
    var list = new List<string>();
    string xpath = "//*[@Name='" + attributeName + "']";
    XmlNodeList xmlNodeList = document.SelectNodes(xpath);
    foreach (XmlNode xmlNode in xmlNodeList)
    {
        list.Add(xmlNode.Attributes[attributeName].InnerText);
    }
    return list;
} 

我尝试选择包含方法参数attributeName中给定名称的属性的所有节点,并将值添加为变量list

例子:

这个方法调用:

List<string> result = RetrieveValuesForAttribute("itemSelectedHandler");

应该返回一个包含字符串"OnSelectedRelatedContactChanged"的列表

这是xml文件:

<GroupBoxWrapper id="gbRelatedContacts" text="Related Contacts">
  <TabIndex>0</TabIndex>
  <TabStop>false</TabStop>
  <PanelWrapper id="pnlRelatedContactsView" width="1350">
    <TabIndex>0</TabIndex>
    <TabStop>false</TabStop>
    <ListViewWrapper id="lvRelatedContacts" itemSelectedHandler="OnSelectedRelatedContactChanged" itemDoubleClickHandler="OnRelatedContactDoubleClick">
      <TabIndex>0</TabIndex>
      <TabStop>true</TabStop>
      <ListViewColumns>
        <Column title="Name" mapNode="Contact'Name" />
        <Column title="Lastname" mapNode="Contact'Lastname" />
      </ListViewColumns>
    </ListViewWrapper>
  </PanelWrapper>
</GroupBoxWrapper>

进一步问题:用LINQ解决这个问题会更好吗?

解决方案1:谢谢你,ywm

public List<string> RetrieveValuesForAttribute(string attributeName)
{
    var list = new List<string>();
    string xpath = @"//*[@" + attributeName + "]";
    XmlNodeList xmlNodeList = document.SelectNodes(xpath);
    foreach (XmlNode xmlNode in xmlNodeList)
    {
        list.Add(xmlNode.Attributes[attributeName].InnerText);
    }
    return list;
}

解决方案2:谢谢你,Jon Skeet

public List<string> RetrieveValuesForAttribute(string attributeName)
{
    //document is an XDocument
    return document.Descendants()
                   .Attributes(attributeName)
                   .Select(x => x.Value)
                   .ToList();
}

LINQ到XML的解决方案在我看来要优雅得多。

选择包含某个属性的所有XML节点

如果您可以使用LINQ to XML来完成此操作,则完全是微不足道的:

// Note that there's an implicit conversion from string to XName,
// but this would let you specify a namespaced version if you want.
public List<string> RetrieveValuesForAttribute(XName attributeName)
{
    // Assume document is an XDocument
    return document.Descendants()
                   .Attributes(attributeName)
                   .Select(x => x.Value)
                   .ToList();
} 

您要查找的XPath应该是

"//*[@" + attributeName + "]"

您原来的XPath正在做的是寻找具有Name属性值为attributeName的所有元素

这将查找任何带有attributeName

属性的元素
//*[@title]

将返回列元素

我不确定c#语法,但我认为xpath值是错误的。请尝试:"//*[@itemSelectedHandler]"。c#

  string xpath = "//*[@" + attributeName + "]";