如果共享同一父节点的另一个节点等于某个值,如何获取XML节点的值?

时间:2016-03-12 06:28:38

标签: c# xml database

我的XML结构如下:

<Database>
  <Member>
    <Name>PersonA</Name>
    <Rank>RankIWant</Rank>
  </Member>
  <Member>
    <Name>PersonB</Name>
    <Rank>RankIDontWant</Rank>
  </Member>
</Database>

我有PersonA的<Name>值,我想要&#34; RankIWant&#34;,但我不知道如何获取我拥有的信息。我该怎么办?

3 个答案:

答案 0 :(得分:3)

您可以使用XPath查询。以你的例子:

//Member[Name = "PersonA"]/Rank

小提琴:https://dotnetfiddle.net/udobyd

XPath查询意味着,选择所有(//表示所有,独立于位置)Rank具有父Member个节点的节点恰好具有Name后代,其值为PersonA

如果您习惯使用Linq,也可以使用Linq to Xml。在这种情况下,等效代码为:

var nodes = XElement.Parse(xml).Descendants("Rank")
        .Where(x => x.Parent.Descendants("Name").Any(y => y.Value == "PersonA"));

在这里小提琴:https://dotnetfiddle.net/bOVOy7

对于您的特定查询,我更喜欢XPath版本,但您可以选择。

答案 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
    {
        static void Main(string[] args)
        {
            string xml =
                "<Database>" +
                  "<Member>" +
                    "<Name>PersonA</Name>" +
                    "<Rank>RankIWant</Rank>" +
                  "</Member>" +
                  "<Member>" +
                    "<Name>PersonB</Name>" +
                    "<Rank>RankIDontWant</Rank>" +
                  "</Member>" +
                "</Database>";

            XElement database = XElement.Parse(xml);

            XElement query = database.Elements("Member")
                .Where(x => x.Element("Rank").Value == "RankIWant").FirstOrDefault();
        }
    }
}

答案 2 :(得分:0)

这是另一种方法。

    private static void Main()
    {
        string myRankValue = "";

        var xml = @"<Database>
                  <Member>
                    <Name>PersonA</Name>
                    <Rank>RankIWant</Rank>
                  </Member>
                  <Member>
                    <Name>PersonB</Name>
                    <Rank>RankIDontWant</Rank>
                  </Member>
                </Database>";
        var xDoc = XDocument.Parse(xml);
        var firstMember =
            xDoc.Descendants("Member")
                .Where(d => d.Descendants("Name").First().Value == "PersonA")
                .Descendants("Rank")
                .FirstOrDefault();
        if (firstMember != null)
        {
            myRankValue = firstMember.Value;
        }
        Console.WriteLine(myRankValue);
    }
}