【发布时间】:2018-06-05 09:53:25
【问题描述】:
我需要基于另一个 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>
【问题讨论】:
-
@bommelding 我在上面发布了 XML,非常直截了当:一级元素,没有命名空间等。
-
我尝试了很多组合,包括
originalDoc.Element("users").Elements().Where(e => e.Attribute("Login").Value == xUser.Attribute("Login").Value),我认为这就是你在这里的意思,但无论如何,结果总是为空。allElements不是XDocument,当然,而是一个 `IEnumerable集合,所以我需要以不同的方式访问它,并试图弄清楚如何。 -
变量
duplicates始终为空,其中变量allElements具有XML 文件中的内容,即e.Name.LocalName == "user"用于获取元素的名称,而不是e.Attribute("Login") == xUser.Login获取元素属性的内容。 -
好吧,
e.Attribute("Login")应该是e.Attribute("Login").Value,xUser.Login是无效的 C#。你应该回到allElements.Where() -
好的,抱歉,这是将代码简化为示例的疏忽。我现在更改了代码以表明它不适用于此:
var duplicates = originalDoc.Element("users").Elements().Where(e => e.Attribute("Login").Value == "Demo1");。好像e.Attribute("Login").Value的语法不正确,所以什么也找不到。
标签: c# linq-to-xml