访问具有特定值的XElement

本文关键字:XElement 访问 | 更新日期: 2024-10-20 04:21:43

我正试图将我的战舰游戏保存到XML中,到目前为止,它已经做得很好了。我在XML文件中保存的是玩家名称、船只坐标和失误。

船舶的ID属性是知道哪个船舶坐标构成一整艘船。接下来是通过在正确的元素中添加一个属性来标记每艘被击中的船只,我知道通过它的值可以得到什么元素

但我不知道如何获得它。我所找到的只是如何通过它的name和所有具有该名称的元素来获得XElement

<?xml version="1.0" encoding="UTF-8" ?>
<Players>
  <Playerboard>
    <Name>Player</Name>
    <Ships>
      <ship id="1213">12_13</ship>
      <ship id="1213">12_14</ship>
      <ship id="1211">12_11</ship>
      <ship id="1211">12_12</ship>
    </Ships>
    <Misses>
      <Miss>3_9</Miss>
      <Miss>9_12</Miss>
      <Miss>10_12</Miss>
    </Misses>
  </Playerboard>
  <Computerboard>
    <Name>AI</Name>
    <Ships>
      <ship id="1010">10_10</ship>
      <ship id="1010">10_11</ship>
      <ship id="1010">10_12</ship>
      <ship id="1010">10_13</ship>
      <ship id="11">1_1</ship>
      <ship id="11">2_1</ship>
    </Ships> 
    <Misses>
      <Miss>0_2</Miss>
      <Miss>0_3</Miss>
      <Miss>1_3</Miss>
    </Misses>
  </Computerboard>
</Players>

这是我尝试获得正确元素的结果,但没有成功。在我下面的例子中,"k"一直是空的。

XElement e = xelement.Element("Playerboard");
var ships = from s in e.Elements("Ships")            
                        where (string)s.Element("ship") == x + "_" +y
                        select s;
foreach (XElement k in ships) 
{ 
   Console.WriteLine(k);
}

例如,我想为船添加一个值为12_12的属性,我该怎么做?

访问具有特定值的XElement

这对我来说很好:

var doc = XDocument.Parse(xml);
var elements =
    doc
    .Root                       //Ignore the root
    .Element("Playerboard")     //The Playerboard element.
    .Element("Ships")           //There's only one Ships element.
    .Elements("ship")           //Get all the ship elements from Ships.
    .Where(ship => ship.Value == "12_12");  //.Value is a little more explicit but you
                                            //want strings anyway.
foreach (var element in elements)
{
    Console.WriteLine(element);
    element.Add(new XAttribute("Name", "Value")); //Adding your new attribute.
    Console.WriteLine(element); 
}

我之所以使用lambda语法,是因为我更喜欢它(对不起,它只是让我做的事情更清楚)。

如果只期望一个ship元素与给定值匹配,那么也可以在末尾使用.Single()来避免集合。

您也可以这样做:

   int x = 12, y = 12;
   var doc =  XDocument.Load("[path of your xml]");
   //Finding the playerboard, by your structure I suppose you have one
   var playerBoard= doc.Descendants("Playerboard").FirstOrDefault();
  var ship = playerBoard.Element("Ships").Elements("ship").FirstOrDefault(e => e.Value == x + "_" + y);
  //Adding an attribute to the ship
  ship.Add(new XAttribute("Foo", "Boo"));