linq to xml - 如何根据多字段查询获取 XElement
linq to xml - How to get XElement based on multiple fields query
我有这个 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='DEMOFIELD' 和 label='IIS:'?我是否使用某种多位置?
您应该查询 FieldsDefinition
个元素:
var x = from fd in xDoc.Descendants("FieldsDefinition")
where (string)fd.Element("Field") == "DEMOFIELD"
&& (string)fd.Element("Label") == "IIS: "
select fd;
注意:我建议使用 trim 标签值以避免不同数量的空格影响结果:
&& ((string)fd.Element("Label")).Trim() == "IIS:"
此外,如果您完全确定每个 FieldsDefinition
都有 Field
和 Label
元素,那么您可以直接使用 Value
字段:
var x = xDoc.Descendants("FieldsDefinition")
.Where(fd => fd.Element("Field").Value == "DEMOFIELD"
&& fd.Element("Label").Value.Trim() == "IIS:");
您可能想要更上一层楼并找到符合您条件的所有 FieldsDefinition
个元素:
var fieldDefs = doc
.Descendants("FieldsDefinition")
.Where(x => (string) x.Element("Field") == "DEMOFIELD" &&
(string) x.Element("Label") == "IIS: ");
有关工作演示,请参阅 this fiddle。
我有这个 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='DEMOFIELD' 和 label='IIS:'?我是否使用某种多位置?
您应该查询 FieldsDefinition
个元素:
var x = from fd in xDoc.Descendants("FieldsDefinition")
where (string)fd.Element("Field") == "DEMOFIELD"
&& (string)fd.Element("Label") == "IIS: "
select fd;
注意:我建议使用 trim 标签值以避免不同数量的空格影响结果:
&& ((string)fd.Element("Label")).Trim() == "IIS:"
此外,如果您完全确定每个 FieldsDefinition
都有 Field
和 Label
元素,那么您可以直接使用 Value
字段:
var x = xDoc.Descendants("FieldsDefinition")
.Where(fd => fd.Element("Field").Value == "DEMOFIELD"
&& fd.Element("Label").Value.Trim() == "IIS:");
您可能想要更上一层楼并找到符合您条件的所有 FieldsDefinition
个元素:
var fieldDefs = doc
.Descendants("FieldsDefinition")
.Where(x => (string) x.Element("Field") == "DEMOFIELD" &&
(string) x.Element("Label") == "IIS: ");
有关工作演示,请参阅 this fiddle。