使用self id获取子节点

时间:2017-11-22 02:59:55

标签: c# xml

我正在尝试获取xml的子节点。我的父节点中有一个名为“id”的属性。这是xml内容:

<?xml version="1.0"?>
<languages>
    <item id="button_back">
        <turkish>geri</turkish>
        <english>back</english>
    </item>
    <item id="button_install">
        <turkish>seçilileri kur</turkish>
        <english>install selected</english>
    </item>
</languages>

说我想获得土耳其标签的价值。我怎样才能做到这一点?这是我试过的:

using (XmlReader xr = XmlReader.Create(@"languages.xml"))
{
    XDocument xdoc = XDocument.Load(xr);
    var query = from t in xdoc.Descendants("item")
                where t.Element("id").Value.ToLower() == "button_back" // Edit
                select new
                {
                    ID = t.Attribute("id").Value,
                    Turkish = t.Element("turkish").Value
                };

    foreach (var it in query)
    {
        MessageBox.Show(it.Turkish);
    }

}

编辑:此代码为MessageBox提供了 xr 行的空引用异常。

2 个答案:

答案 0 :(得分:0)

您在那里获得NullReferenceException,因为您认为Element("id")不为空。它会,因为你没有id元素。您需要使用Attribute("id")

答案 1 :(得分:0)

我喜欢用xml linq和字典

来做这件事
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            Dictionary<string, string> dict = doc.Descendants("item")
                .GroupBy(x => (string)x.Attribute("id"), y => (string)y.Element("turkish"))
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());
        }
    }
}