在Linq中查找元素到XML
本文关键字:XML 元素 查找 Linq | 更新日期: 2023-09-27 18:17:59
生成的XML文件是这样的
<?xml version="1.0" encoding="utf-8"?>
<Members xmlns="urn:lst-emp:emp">
<Member xmlns="">
<!--Info for Member TESTER-->
<AccountName>Test Name</AccountName>
<AccountNumber>Test Number</AccountNumber>
<AccountBalance>Test Balance</AccountBalance>
</Member>
<Member xmlns="">
<!--Info for Member Jeff Reed-->
<AccountName>Jeff Reed</AccountName>
<AccountNumber>5929</AccountNumber>
<AccountBalance>9223.01</AccountBalance>
</Member>
</Members>
我可以使用下面的方法在整个XML中搜索AccountName,但是在它作为匹配出现之后,我需要一种方法来获得相应的xElements AccountNumber,以验证它的PIN (Account Number)是否等于我的密码文本框中的PIN。
internal static bool userExists(String validationName)
{
bool foundUser = false;
//check for a name
XElement xelement = XElement.Load(Application.LocalUserAppDataPath + "''members.xml");
IEnumerable<XElement> members = xelement.Elements();
foreach (var member in members)
{
if (member.Element("AccountName").Value == validationName)
{
//MessageBox.Show("It's a match.");
foundUser = true;
return foundUser;
}
else
{
//MessageBox.Show("No match found.");
}
}
return foundUser;
}
我该怎么做呢?我考虑过将其转换回我的BankMember对象,但是我需要一种方法来首先从匹配的用户名中解析信息。
BankMember newMember = new BankMember(txtBxAccountName.Text.ToString(), int.Parse(txtBxAccountNumber.Text), float.Parse(txtBxStartingBalance.Text.TrimStart('$')));
下面的代码给出了匹配元素的账号,
members.Where(x=> x.Element("AccountName").Value==validationName).Select(x=> x.Element("AccountNumber").Value).FirstOrDefault();
父节点是关键。像这样:
internal static XElement FindMember(String validationName)
{
XDocument doc = XDocument.Load(Application.LocalUserAppDataPath + "''members.xml");
XElement accountNameElement = doc.Root
.Elements("Member")
.Elements("AccountName")
.FirstOrDefault(e => e.Value == validationName);
if (accountNameElement != default(XElement))
return accountNameElement.Parent;
return default(XElement);
}
被这样调用:
XElement memberElement= FindMember("Test Name");
if (memberElement== default(XElement))
Console.WriteLine("Not Found");
else
{
Console.WriteLine("Found {0}, {1}, {2}"
, memberElement.Element("AccountName").Value
, memberElement.Element("AccountNumber").Value
, memberElement.Element("AccountBalance").Value);
}