Мне нужно выбрать все узлы, которые содержат атрибут с определенным именем.выберите все узлы xml, которые содержат определенный атрибут
Это мой текущий, а не рабочий подход.
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>
Далее que stions: Было бы лучше решить это с помощью 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: спасибо, Джон Скит
public List<string> RetrieveValuesForAttribute(string attributeName)
{
//document is an XDocument
return document.Descendants()
.Attributes(attributeName)
.Select(x => x.Value)
.ToList();
}
LINQ к XML Решение выглядит гораздо более элегантно ко мне.
Я бы определенно использовал LINQ для XML для этого. Можете ли вы сделать 'document' вместо' XDocument'? –
Да, я могу, я попробую его с LINQ to XML – Joel