c# - 访问具有特定值的 XElement

标签 c# xml linq linq-to-xml xelement

我正在尝试将我的战舰游戏保存为 XML,到目前为止,一切进展顺利。我在 XML 文件中保存的是玩家姓名、船只坐标和未命中次数。

船舶的ID属性是为了知道哪个船舶坐标构成了整艘船舶。接下来是通过向正确的元素添加属性来标记每艘船已被击中,并且我知道通过其值获取哪个元素。

但我不知道如何获得它。我所发现的只是如何通过其名称以及具有该名称的所有元素来获取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() 来避免集合。

关于c# - 访问具有特定值的 XElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28888593/

相关文章:

c# - 如何将字符串列表拆分为较小的字符串列表 block

c# - 如何为匿名类型编写扩展方法?

java - 当 2 个 xsd 文件中有 2 个 XmlRootElement 时,编码/解码

C# Websocket-Sharp - 如何识别客户端

java - 在Group之上展开Android的ExpandableListView Children

java - 解析 XML 文件 (java)

c# - 减少类似查询的重复

c# - "where"使用 linq xml 查询

c# - 使用不带 ViewSortHintAttribute 的通用 View 模型进行 Prism 区域排序

c# - 如何使用 Func<T, bool> 作为 Func<object, bool> 的参数?