2

次のように設定された XML ドキュメント (属性なし) があります。

<variables>
    <variable>
        <name>Name_Value</name>
        <value>Value of Entry</value>
    </variable>
    <variable>
        <name>Name_Value2</name>
        <value>Value of Entry2</value>
    </variable>
</variables>

LINQ to XML を使用<name>して、ドキュメント内のすべての値のリストを取得しました。これらの名前の値は、リストボックス コントロールにアルファベット順に表示されます (これは、XML ドキュメント内の名前の順序ではありません)。

<name>リストボックスでアイテムが選択されたら、そのアイテムの名前を、ノード内のその値を XML ドキュメントで検索するメソッドに渡したいと思います。見つかったら、次のノード (つまり、<value>ノード) を見つけて、その値を文字列として返します。

この情報を得るためにあらゆることを試しましたが、LINQ to XML について十分に理解していないようです。これに対する解決策しか提供できませんか?

4

2 に答える 2

3
XDocument xdoc = XDocument.Load(path_to_xml);
var query = from v in xdoc.Descendants("variable")
            where (string)v.Element("name") == name
            select (string)v.Element("value");

この Linq クエリはIEnumerbale<string>、名前に一致する値要素を返します。指定された名前の変数が複数存在しないことが確実な場合

string value = query.SingleOrDefault();

または単一のクエリで:

string value =  xdoc.Descendants("variable")
                    .Where(v => (string)v.Element("name") == name)
                    .Select(v => (string)v.Element("value"))
                    .SingleOrDefault();
于 2013-01-11T15:12:15.603 に答える
0

XPath を使用するアプローチの方が読みやすいと思います。

using System;
using System.Linq;
using System.Xml.Linq;
using System.Xml;
using System.Xml.XPath;

public class Test
{
    public static void Main()
    {
        var xml = XElement.Parse(@"<variables>
    <variable>
        <name>Name_Value</name>
        <value>Value of Entry</value>
    </variable>
    <variable>
        <name>Name_Value2</name>
        <value>Value of Entry2</value>
    </variable>
</variables>");

        Console.WriteLine(
                      GetVariableValue(xml, "Name_Value")
                ); 
        Console.WriteLine(
                      GetVariableValue(xml, "Name_Value2")
                ); 

    }

        public static string GetVariableValue(XElement xml, string variableName)
        {
             return xml.XPathSelectElement("variables/variable[name='" + variableName + "']/value").Value;
        }
}
于 2013-01-11T15:23:53.540 に答える