【问题标题】:linq to xml - How to get XElement based on multiple fields querylinq to xml - 如何根据多字段查询获取 XElement
【发布时间】:2017-01-16 15:20:55
【问题描述】:

我有这个 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>

如果我想获取 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);
                }

但是如何查询 field='DEMOFIELD' 和 label='IIS:'?我是否使用了一种 multi-where?

【问题讨论】:

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


    【解决方案1】:

    您可能想要更上一层楼并找到所有符合您条件的FieldsDefinition 元素:

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

    请参阅this fiddle 以获得工作演示。

    【讨论】:

      【解决方案2】:

      您应该查询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:");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多