Ich muss alle Knoten auswählen, die ein Attribut mit einem bestimmten Namen enthalten.Alle xml-Knoten auswählen, die ein bestimmtes Attribut enthalten
Dies ist mein derzeitiger, nicht funktionierender Ansatz.
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;
}
Ich versuche, alle Knoten auszuwählen, die das Attribut mit dem Namen in der Methodenparameter attributeName
gegeben enthalten und fügen Sie den Wert der Variable list
.
Beispiel:
Dieser Methodenaufruf:
List<string> result = RetrieveValuesForAttribute("itemSelectedHandler");
Sollte eine Liste zurück, die die Zeichenfolge "OnSelectedRelatedContactChanged"
Dies ist die XML-Datei:
<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>
Weitere que stations: Wäre es besser, dies mit LINQ zu lösen?
Lösung 1: danke, 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;
}
Lösung 2: danke, Jon Skeet
public List<string> RetrieveValuesForAttribute(string attributeName)
{
//document is an XDocument
return document.Descendants()
.Attributes(attributeName)
.Select(x => x.Value)
.ToList();
}
Die LINQ to XML-Lösung für mich weit mehr elegant aussieht.
Ich würde definitiv LINQ zu XML dafür verwenden. Kann man "Dokument" stattdessen ein "XDocument" machen? –
Ja, ich kann, ich werde es mit LINQ to XML versuchen – Joel