选择包含某个属性的所有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的解决方案在我看来要优雅得多。
如果您可以使用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 + "]";