【发布时间】:2021-08-21 13:45:07
【问题描述】:
我想了解使用 LINQ XML 进行的复杂过滤。 我创建了一个简单的 XML 示例(DataBaseCities.xml):
<?xml version="1.0" encoding="utf-8"?>
<DataBase>
<DocumentInfo version="1.0" schemaVersion="1.0"/>
<ListOfMegaCities>
<MegaCities city="Moscow" continent="Europe">
<VariantConstraint>
<LanguageRef LanguageId="russian">
<LanguageDialectsRef DialectsId="north"/>
</LanguageRef>
</VariantConstraint>
<Districts>
<CityDistrict District="Arbat"/>
<CityDistrict District="Basmanny"/>
</Districts>
</MegaCities>
<MegaCities city="New York" continent="North America">
<VariantConstraint>
<LanguageRef LanguageId="english">
<LanguageDialectsRef DialectsId="west"/>
</LanguageRef>
<LanguageRef LanguageId="spanish">
<LanguageDialectsRef DialectsId="cental"/>
</LanguageRef>
</VariantConstraint>
<Districts>
<CityDistrict District="Queens"/>
<CityDistrict District="Bronx"/>
</Districts>
</MegaCities>
<MegaCities city="London" continent="Europe">
<VariantConstraint>
<LanguageRef LanguageId="english">
<LanguageDialectsRef DialectsId="west"/>
</LanguageRef>
<LanguageRef LanguageId="spanish">
<LanguageDialectsRef DialectsId="central"/>
</LanguageRef>
<LanguageRef LanguageId="french">
<LanguageDialectsRef DialectsId="central"/>
</LanguageRef>
</VariantConstraint>
<Districts>
<CityDistrict District="Greenwich"/>
<CityDistrict District="Westminster"/>
</Districts>
</MegaCities>
</ListOfMegaCities>
</DataBase>
我尝试过滤如下:
XElement root = XElement.Load(@"DataBaseCities.xml");
IEnumerable<XElement> ListOfMegaCities =
from el in root.Descendants("MegaCities")
where
(from add in el.Descendants("LanguageRef")
where
(string)add.Attribute("LanguageId") == "english"
select add)
.Any()
select el;
foreach (XElement el in ListOfMegaCities)
{
Console.WriteLine((string)el.Attribute("city"));
}
所以输出是:
New York
London
但我想过滤多个属性。
-
如果我尝试使用这些行进行过滤:
(string)add.Attribute("LanguageId") == "english" && (string)add.Attribute("LanguageId") == "西班牙语"
为什么它不起作用?
- 如何过滤“方言 ID”?
示例:我想通过这个过滤得到“纽约”:
LanguageId="english"
DialectsId="west"
LanguageId="spanish"
DialectsId="cental"
也许有人有一个很好的复杂过滤来源?我找到了这个https://docs.microsoft.com/de-de/dotnet/standard/linq/write-queries-complex-filtering,但这只是部分帮助了我......
【问题讨论】:
-
IMO 创建代表 xml 结构的类,然后反序列化为新类,最后使用 linq 过滤等。
-
建立或条件。它的相同元素。 (string)add.Attribute("LanguageId") == "english" || (string)add.Attribute("LanguageId") == "西班牙语"。您请求的逻辑应该是: ((string)add.Attribute("LanguageId") == "english" || (string)add.Attribute("LanguageId") == "spanish") || ((string)add.Attribute("DialectsId") == "west" || (string)add.Attribute("DialectsId") == "cental")
-
@Aleksej,要将 xml 反序列化为 CLR 对象,请参阅另一个问题:stackoverflow.com/questions/364253/…
-
好的,谢谢。我会尝试。如果我找到解决方案,我会在这里发布。
-
西班牙语的 dialectsId 是纽约的“中部”和伦敦的“中部”。想要这种差异?