访问具有特定值的 XElement
Accessing XElement with specific value
我正在尝试将我的战舰游戏保存到 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 的飞船添加一个属性,我该怎么做?
这对我来说很好用:
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"));
我正在尝试将我的战舰游戏保存到 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 的飞船添加一个属性,我该怎么做?
这对我来说很好用:
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"));