Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果共享同一父节点的另一个节点等于某个值,如何获取XML节点的值?_C#_Xml_Database - Fatal编程技术网

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

C# 如果共享同一父节点的另一个节点等于某个值,如何获取XML节点的值?,c#,xml,database,C#,Xml,Database,我的XML的结构如下: <Database> <Member> <Name>PersonA</Name> <Rank>RankIWant</Rank> </Member> <Member> <Name>PersonB</Name> <Rank>RankIDontWant</Rank> </Member

我的XML的结构如下:

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

人格面具
兰基旺
人
兰基登旺特
我有PersonA的
值,我想要“RankIWant”,但我不知道如何利用我所拥有的信息获得它。我该怎么办?

您可以使用查询。例如:

//成员[Name=“PersonA”]/Rank
小提琴:

XPath
查询意味着,选择all(该
/
意味着all,与位置无关)
对拥有父
成员的节点进行排序
节点,该节点恰好具有值为
PersonA
名称
子节点

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

var nodes = XElement.Parse(xml).Descendants("Rank")
        .Where(x => x.Parent.Descendants("Name").Any(y => y.Value == "PersonA"));
在这里拉小提琴:

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

使用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();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串xml=
"" +
"" +
“人物”+
“兰基旺”+
"" +
"" +
“人B”+
“兰基顿旺特”+
"" +
"";
XElement数据库=XElement.Parse(xml);
XElement查询=database.Elements(“成员”)
.Where(x=>x.Element(“Rank”).Value==“RankIWant”).FirstOrDefault();
}
}
}

这里是另一种方法

    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);
    }
}
private static void Main()
{
字符串myRankValue=“”;
var xml=@”
人格面具
兰基旺
人
兰基登旺特
";
var xDoc=XDocument.Parse(xml);
第一名成员=
xDoc.后代(“成员”)
.Where(d=>d.subjections(“Name”).First().Value==“PersonA”)
.后代(“等级”)
.FirstOrDefault();
if(firstMember!=null)
{
myRankValue=firstMember.Value;
}
Console.WriteLine(myRankValue);
}
}

找到具有所需值的名称节点,获取父节点,读取秩的值。见XDocument。也可以用一个XPath语句完成,但步骤很小……这需要您知道
Rank
RankIWant
。这不是问题中所说的,然后搜索元素名称而不是元素排名。这只会给你第一个成员/排名的值,根本不是查询