linq to xml - 如何根据多个字段查询

时间:2017-01-16 15:20:55

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

我有这个xml文件:

<?xml version="1.0" encoding="utf-8"?>
<FieldsDefinitions>
  <FieldsDefinition>
    <Field>DEMOFIELD</Field>
    <Length>15</Length>
    <Label>IIS: </Label>
    <Type>DropDown</Type>
  </FieldsDefinition>
  <FieldsDefinition>
    <Field>IIS</Field>
    <Length>15</Length>
    <Label>IIS: </Label>
    <Type>DropDown</Type>
  </FieldsDefinition>
  <FieldsDefinition>
    <Field>DEMOFIELD</Field>
    <Length>20</Length>
    <Label>Demo Field</Label>
    <Type>Text</Type>
  </FieldsDefinition>
</FieldsDefinitions>

如果我想获得值为= DEMOFIELD的所有字段,我可以这样做:

XDocument xDoc = XDocument.Load("file.xml");
                var x = xDoc.Descendants("Field").Where(elem => elem.Value == "DEMOFIELD");
                foreach(XElement e in x)
                {
                    _log.Debug(e.Name + " = " + e.Value);
                }

但是如何查询field =&#39; DEMOFIELD&#39;和标签=&#39; IIS:&#39;?我是否使用多种位置?

2 个答案:

答案 0 :(得分:2)

您可能想要升级一级,找到符合条件的所有FieldsDefinition元素:

var fieldDefs = doc
    .Descendants("FieldsDefinition")
    .Where(x => (string) x.Element("Field") == "DEMOFIELD" &&
                (string) x.Element("Label") == "IIS: ");

有关正常工作的演示,请参阅this fiddle

答案 1 :(得分:1)

您应该查询FieldsDefinition元素:

var x = from fd in xDoc.Descendants("FieldsDefinition")
        where (string)fd.Element("Field") == "DEMOFIELD"
           && (string)fd.Element("Label") == "IIS: "
        select fd;

注意:我建议修剪标签的值以避免不同数量的空格影响结果:

           && ((string)fd.Element("Label")).Trim() == "IIS:"

此外,如果您完全确定每个FieldsDefinition同时包含FieldLabel元素,那么您可以直接使用Value字段:

var x = xDoc.Descendants("FieldsDefinition")
            .Where(fd => fd.Element("Field").Value == "DEMOFIELD"
                      && fd.Element("Label").Value.Trim() == "IIS:");