使用LINQ选择XML节点并进行修改

时间:2013-04-23 17:56:22

标签: linq linq-to-xml

我有以下XML:

<Config>
   <Book>
      <Name> Book Name #1 </Name>
      <Available In>
               <Country>US</Country>
               <Country>Canada</Country>
      </Available In>
   </Book>
</Config>

我需要找到特定国家/地区可用的Book的所有实例,然后在“Available In”下面引入一个节点。我添加where语句时,我的选择语句失败:

XElement xmlFile = XElement.Load(xmlFileLocation);
var q = (from c in xmlFile.Elements(“Book”)
           where c.Elements(Country).Value == "Canada"
           select c;

.Value无法解析,toString在stringform中给我整个子节点。我需要选择特定国家/地区的所有图书,以便我可以将它们全部更新为包含新的区域设置节点,例如:

<Config>
       <Book>
          <Name> Book Name #1 </Name>
          <Available In>
                   <Country>US</Country>
                   <Country>Canada</Country>
          </Available In>
          <LocaleIDs>
               <LocalID> 3066 </LocaleID>
          <LocaleIDs>
       </Book>
    </Config>

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您尝试在调用Value的结果上使用Elements,该结果会返回元素的序列。那不行 - 它没有任何意义。你想一次在一个元素上调用它。

此外,您正在尝试查找Book直接子项,这会忽略Available In元素,该元素甚至不是有效的元素名称...

我怀疑你想要这样的东西:

var query = xmlFile.Elements("Book")
                   .Where(x => x.Descendants("Country")
                                .Any(x => (string) x == "Canada"));

换句话说,查找Book个元素,其中任何后代Country元素的文本值为“Canada”。

您仍然需要修复XML以使用有效的元素名称...