2013-04-11 20 views
6

Belirli bir ada sahip bir öznitelik içeren tüm düğümleri seçmem gerekiyor.Belirli bir özelliği içeren tüm xml düğümlerini seçin

Bu benim şu andaki değil çalışma yaklaşımım.

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; 
} 

I yöntem parametresi attributeName verilen isimle özelliği içeren tüm düğümleri seçip değerini değişken list eklemek deneyin.

Örnek:

Bu yöntem çağrı:

<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> 
:

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

dize içeren bir liste dönmelidir

Bu xml dosyasıdır "OnSelectedRelatedContactChanged"

Daha fazla bilgi stions: Bunu LINQ ile çözmek daha iyi olur mu?

Çözüm 1: teşekkür ederim YWM 2

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; 
} 

Çözüm: Çözüm çok daha zarif bana bakıyor LINQ XML teşekkür ederim, Jon Skeet

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

. Bunun için XML LINQ kullanmak olsaydı

+1

Bunun için XML için kesinlikle LINQ kullanırım. Bunun yerine belgeyi 'XDocument' yapabilir misiniz? –

+0

Evet, bunu LINQ to XML ile deneyeceğim – Joel

cevap

8

, bu tamamen önemsiz olacaktır:

// 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(); 
} 
4

Aradığınız XPath

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

olmalıdır orijinal XPath bakıyordu ne yapıyordu Bu attr sahip bir nitelik olan herhangi bir eleman arar attributeName

değere sahip bir Name özelliğine sahip tüm elemanları

//*[@title] 

ibuteName

sütun elemanları

C# sözdizimi hakkında
+0

Çözümünüz için iyi çalışıyor. Ama LINQ’dan XML’e daha çok yaklaşmayı seviyorum. – Joel

1

Im emin değil dönecekti ama xpath vlaue yanlış olduğunu düşünüyorum. Lütfen deneyin: "// * [@ itemSelectedHandler]". Ne yapmalı? C#

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