LINQ在节点内搜索给定的字符串值

时间:2011-07-29 08:03:51

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

我是使用LINQ的新手。我想使用LINQ来检索给定字符串的某个值。我有一个包含以下格式的XML文档(files.xml)。

<?xml version="1.0" encoding="utf-8" ?>
<DocumentMappings>
    <DocumtentCategory>
      <CategoryId>001</CategoryId>
      <CategoryName>Checksheet and Lists</CategoryName>
      <DestinationDocumentLibrary>CheckList and Lists</DestinationDocumentLibrary>
      <Multiple>false</Multiple>
    </DocumtentCategory>

    <DocumtentCategory>
      <CategoryId>011</CategoryId>
      <CategoryName>Product Information</CategoryName>
      <DestinationDocumentLibrary>Product Information</DestinationDocumentLibrary>
      <Multiple>true</Multiple>     
    </DocumtentCategory>

</DocumentMappings>

问题

如何使用LINQ将“DestinationDocumentLibrary”的值作为“Checksheet and Lists”的“CategoryName”的字符串进行检索。

在上面的示例中,“Checksheet and Lists”作为参数(字符串)传递,并将动态传递给LINQ查询。

希望问题清楚,并提前多多感谢。

3 个答案:

答案 0 :(得分:1)

尝试一下:

public string GetDestination(string categoryName, XDocument xDoc)
{

     var query = (from x in xDoc.Descendants("DocumetentCategory")
                  where ((string)x.Element("CategoryName")).Contains(categoryName)
                  select (string)x.Element("DestinationDocumentLibrary")).SingleOrDefault();

     return (string)query;
}

xDoc是一个包含xml的XDocument。

答案 1 :(得分:0)

var values = doc.Descendants("DocumtentCategory")
                .Where(x => x.Descendants("CategoryName")
                .Where(x1 => x1.Value == "Checksheet and Lists").Any())
                .Select(x => x.Descendants("DestinationDocumentLibrary").First().Value)
                .ToList();

答案 2 :(得分:0)

这可能不是最好的,但似乎有效:

XDocument doc = XDocument.Parse(xml);
var s = doc.Descendants("DestinationDocumentLibrary")
           .Where(e => e.Parent.Element("CategoryName")
                               .Value
                               .Equals("Checksheet and Lists"))
           .FirstOrDefault()
           .Value;

并且只是为了完整性 - 获取Linqpad的副本以测试这种事情。