7

特定の名前の属性を含むすべてのノードを選択する必要があります。

これは私の現在の、実際のアプローチではありません。

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その値を variable に追加しようとしました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 to XML ソリューションは、私にははるかにエレガントに見えます。

4

3 に答える 3

9

これに 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();
} 
于 2013-04-11T09:58:19.113 に答える
5

あなたが探しているXPathは

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

Name元の XPath が行っていたのは、値を持つ属性を持つすべての要素を探すことでしたattributeName

これは、attributeName の属性を持つ要素を探します。

//*[@title]

列要素を返します

于 2013-04-11T09:58:26.523 に答える
2

C# の構文についてはよくわかりませんが、xpath の値が間違っていると思います。"//*[@itemSelectedHandler]" を試してください。C#で何をすべきか

  string xpath = "//*[@" + attributeName + "]";
于 2013-04-11T10:07:57.893 に答える