簡體   English   中英

使用linq讀取xml文件

[英]read xml file using linq

我有以下xml文件

<?xml version="1.0" encoding="utf-8"?> 
<Users>
    <User>
        <Name>John Smith</Name>
        <test>
            <Date>23.05.2011</Date>
            <points>33</points>
        </test>
        <test>
            <Date>22.06.2011</Date>
            <points>29</points>
        </test>
    </User>
</Users>

我想使用linq來提取用戶名是“John Smith”的測試的日期和點數。

我將如何構建我的linq?

我做了以下,但沒有按我的意願工作:

XElement main = XElement.Load(@"users.xml");

string t = "John Smith";
var v = from user in main.Elements("User")
        where t == users.Element("Name").Value
        select users;

MessageBox.Show(v.First().Element("Date").Value.ToString()); 

我不確定你希望輸出的格式是什么,但這個示例代碼應該得到日期和點。 這會將結果投影為匿名類型:

class Program
{
    static void Main(string[] args)
    {
        XElement main = XElement.Load(@"users.xml");

        var results = main.Descendants("User")
            .Descendants("Name")
            .Where(e => e.Value == "John Smith")
            .Select(e => e.Parent)
            .Descendants("test")
            .Select(e => new { date = e.Descendants("Date").FirstOrDefault().Value, points = e.Descendants("points").FirstOrDefault().Value });

        foreach (var result in results)
            Console.WriteLine("{0}, {1}", result.date, result.points);
        Console.ReadLine();
    }
}

輸出是:

23.05.2011, 33
22.06.2011, 29
XDocument main = XDocument.Load(@"users.xml"); 

string t = "John Smith"; 
var v = from user in main.Descendants("User") 
    where t == user.Element("Name").Value 
    select user; 

MessageBox.Show(v.First().Element("Date").Value.ToString()); 

應該做的伎倆。

試試吧

class Program
{
    static void Main(string[] args)
    {
        XElement main = XElement.Parse(
@"<Users>
    <User>
        <Name>John Smith</Name>
        <test>
            <Date>23.05.2011</Date>
            <points>33</points>
        </test>
        <test>
            <Date>22.06.2011</Date>
            <points>29</points>
        </test>
    </User>
</Users>");

        var users =
           from m in main.Elements("User")
           where (string)m.Element("Name") == "John Smith"
           select (m.Descendants("test").Descendants("Date").FirstOrDefault().Value);
        foreach (var user in users)
            Console.WriteLine(user);
        Console.ReadLine();
    }
}

問候

關於向John Smith添加另一個節點的另一個問題,這將是解決方案:

class Program
{
    static void Main(string[] args)
    {
        XElement main = XElement.Parse(
    @"<Users>
       <User>
            <Name>Alex</Name>
            <test>
                <Date>08.05.2011</Date>
                <points>4</points>
            </test>
        </User>
        <User>
            <Name>John Smith</Name>
            <test>
                <Date>23.05.2011</Date>
                <points>33</points>
            </test>
            <test>
                <Date>22.06.2011</Date>
                <points>29</points>
            </test>
        </User>
    </Users>");


    var users =
       from m in main.Elements("User")
       where (string)m.Element("Name") == "John Smith"
       select (m.Descendants("test").Descendants("Date").FirstOrDefault().Value);

    XElement Mercury = main.Elements("User").Where(p => (String)p.Element("Name") == "John Smith").FirstOrDefault();
    Mercury.Add(new XElement("test", new XElement("Date", "06.06.2011"), new XElement("points", "01")));

    foreach (var user in main.Elements())
        Console.WriteLine(user);

    Console.ReadLine();
}

}

給出下一個預期結果:

<User>
  <Name>Alex</Name>
  <test>
    <Date>08.05.2011</Date>
    <points>4</points>
  </test>
</User>
<User>
  <Name>John Smith</Name>
  <test>
    <Date>23.05.2011</Date>
    <points>33</points>
  </test>
  <test>
    <Date>22.06.2011</Date>
    <points>29</points>
  </test>
  <test>
    <Date>06.06.2011</Date>
    <points>01</points>
  </test>
</User>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM