c# - 如何使用 LINQ 语法从我的 XDocument 中选择所有具有特定属性值的 XElement?
问题描述
我需要基于另一个 XDocument 创建一个新的 XDocument,因此想要遍历原始 XDocument 的所有 XElement,只将那些通过特定条件的 XElement 添加到新的 XDocument。
问题是我的变量“duplicates”始终为空,但它应该始终至少包含当时当前的一个元素。
XDocument doc = new XDocument();
XElement rootElement = new XElement("users");
var allElements = originalDoc.Element("users").Elements().Where(e => e.Name.LocalName == "user");
foreach (var xUser in allElements)
{
var duplicates = originalDoc.Element("users").Elements().Where(e => e.Attribute("Login").Value == "Demo1");
rootElement.Add(xUser);
}
doc.Add(rootElement);
return doc;
在 originalDoc 是 XDocument 的情况下,那时从我的 XDocument 中选择所有具有特定属性值的 XElement 的 LINQ 语法是什么?
附录:
这是 XML 的样子,没有命名空间或任何额外内容,只有根元素和一级子元素:
<users>
<user ProjectName="TheCompany1" ProjectSlug="testName" Login="Demo1" Name="Test user" ActivationState="FullyActivated" Country="" Created="2011-03-04T20:32:04.367" IsCustomUser="false" DeleteFilesOnLogout="false" Email="validation@company.com" IsDefaultLoginUser="true" IsDefaultTestUser="false" IsLockedOut="false" MaxFileSize="300000" PostFileEnabled="true" RestServiceEnabled="false" Salutation=""Groups="Everyone" />
<user ProjectName="TheCompany2" ProjectSlug="testName" Login="Demo2" Name="Test user" ActivationState="FullyActivated" Country="" Created="2011-03-04T20:32:04.367" IsCustomUser="false" DeleteFilesOnLogout="false" Email="validation@company.com" IsDefaultLoginUser="true" IsDefaultTestUser="false" IsLockedOut="false" MaxFileSize="300000" PostFileEnabled="true" RestServiceEnabled="false" Salutation=""Groups="Everyone" />
<user ProjectName="TheCompany3" ProjectSlug="testName" Login="Demo3" Name="Test user" ActivationState="FullyActivated" Country="" Created="2011-03-04T20:32:04.367" IsCustomUser="false" DeleteFilesOnLogout="false" Email="validation@company.com" IsDefaultLoginUser="true" IsDefaultTestUser="false" IsLockedOut="false" MaxFileSize="300000" PostFileEnabled="true" RestServiceEnabled="false" Salutation=""Groups="Everyone" />
</users>
解决方案
需要两个快速修复!
首先,XML 片段的格式不正确。寻找« Salutation=""Groups=»
应该是« Salutation="" Groups=»
。
其次,只需稍微更改您的查询,
var duplicates = originalDoc.Element("users").Elements().Where(e => e.Attribute("Login").Value=="Demo1");
对此
var duplicates = originalDoc.Root.Elements().Where(e => e.Attribute("Login").Value=="Demo1");
^^^^^^^
你的一切都完成了......或者你可以使用后代。
希望这可以帮助!
推荐阅读
- python - PySpark - ForEachBatch 中的循环导致“SparkContext 只能在驱动程序上创建和访问”错误
- rest - Restful API查询字符串有http 500错误码问题
- dolphindb - 关于“不支持包含方法”的错误
- dns - 在 Azure Api 管理中使用通配符证书
- c# - 子类中的 C# 方法能否具有不同的参数类型(从父类中方法的参数类型派生)?
- android - 状态栏和底部导航栏后面的元素
- sql-server - 如何在 Exists 中包含 OR 条件?
- android - 在颤振小黄瓜集成测试中授予相机权限与Android中的BDD
- python - 如何解决在下面的代码中分配之前引用的这个局部变量?
- python - 使用中间件和依赖注入在 FastAPI(Python) 中记录请求时被阻止的代码