C#使用Linq查询XML以查找匹配项

时间:2016-10-13 11:51:05

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

这是我的XML片段(只有几个条目,而实际上有大约一千个)。

<?xml version="1.0" encoding="UTF-8"?>
<information_code version="3.5">
  <entry code="000" title="Function, data for plans and description"/>
  <entry code="001" title="Title page"/>
  <entry code="002" title="List of pages or data modules"/>
  <entry code="003" title="Change records and highlights"/>
  <entry code="004" title="Access illustration"/>
</information_code>

我需要做的是将'code'属性与我传递给我的查询的值匹配,然后返回'title'属性的值。这真的不应该很难,但我会绕圈子去。

这是我目前所处的位置,但它总是被捕获而没有匹配。我的查询显然有问题。

private string getInfoName(string infoCode)
{
    XDocument mydoc = XDocument.Load(GlobalVars.pathToInfoCodes);
    string name = string.Empty;

    try
    {
        var entry = mydoc
            .Elements("entry")
            .Where(e => e.Attribute("code").Value == infoCode)
            .Single();

        name = entry.Attribute("title").Value;
    }
    catch
    {
        MessageBox.Show("Info code not recognised: " + infoCode);
    }        
   return name;
}

1 个答案:

答案 0 :(得分:1)

问题在于,当您使用<information_code>时,它只会搜索您当前所在的级别,此时此级别为<entry> - 因此此处没有.Element("information_code").Elements("entry")个元素。

您可以使用.Descendants或使用string wantedCode = "001"; var title = XDocument.Load(GlobalVars.pathToInfoCodes) .Descendants("entry") .Where(e => e.Attribute("code")?.Value == wantedCode) .Select(e => e.Attribute("title").Value).FirstOrDefault();

var title = (from e in XDocument.Load("data.xml").Descendants("entry")
             where e.Attribute("code")?.Value == wantedCode
             select e.Attribute("title")?.Value).FirstOrDefault();

您也可以使用查询语法执行此操作。可能看起来更好:

?.

请注意,null语法是C#6.0 Null Propagation。如果您使用的是早期的C#版本,则必须将该属性存储在变量中,检查它是否为.Value,然后才能访问Object.assign