如何使用 LINQ 语法从我的 XDocument 中选择所有具有特定属性值的 XElement?



我需要基于另一个XDocument创建一个新的XDocument,因此想要遍历原始XDocument的所有XElement,只添加那些通过特定标准的XElement到新的XDocument。

问题是我的变量"重复"总是空的,但它应该始终至少包含一个当时当前的元素。

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 中选择所有具有特定属性值的 XE 的 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");
^^^^^^^

你的都完成了...或者你可以使用后代

希望这有帮助!

最新更新