简体   繁体   English

linq to xml-如何基于多字段查询获取XElement

[英]linq to xml - How to get XElement based on multiple fields query

I have this xml file: 我有这个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>

If I want to get all fields with value=DEMOFIELD, I could do something like this: 如果我想获取所有值为value = 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);
                }

But how can I query for field='DEMOFIELD' and label='IIS:'? 但是,如何查询field ='DEMOFIELD'和label ='IIS:'? Do I use a sort of multi-where? 我会使用多种地点吗?

You probably want to step one level up and find all FieldsDefinition elements that match your criteria: 您可能想上一层,找到符合您条件的所有FieldsDefinition元素:

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

See this fiddle for a working demo. 请参阅此小提琴以获得有效的演示。

You should query for FieldsDefinition elements: 您应该查询FieldsDefinition元素:

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

NOTE: I would recomend to trim value of label to avoid different number of spaces affect results: 注意:我建议缩小标签值,以避免不同数量的空格影响结果:

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

Also if you are absolutely sure that every FieldsDefinition has both Field and Label element, then you can use Value field directly: 另外,如果您完全确定每个FieldsDefinition都具有FieldLabel元素,那么可以直接使用Value字段:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM