我有一个登录页面,用户从下拉列表中选择他们的名字,然后在文本框中输入他们的id代码。然后,该页面将重定向到显示用户信息的帐户页面。下载列表和文本框正在加载并检查xml文件,这是一个例子。
<staff>
<idcode>0200</idcode>
<Name id="0200">Doe, John</Name>
</staff>
我希望帐户页面在“名称”节点中检查id属性,以在标签中显示用户的名称。我尝试过使用这里描述的方法: C# Linq to XML query,但我得到的标签的输出是“System.Linq.Enumerable + WhereEnumerableIterator`1 [System.Xml.Linq.XElement]”。这是我的代码:
XDocument xdoc = XDocument.Load(Server.MapPath("Staff.xml"));
var result = xdoc.Descendants("Staff").Elements("Name").Where(n => n.Attribute("id").Value == inputPassword);
nameLabel.Text = result.ToString();
inputPassword是上一页的idcode,可以正确加载。
我是否遗漏了一些简单的内容,或者是否更容易重构xml,以便Name节点是idcode节点的子节点? 感谢。
答案 0 :(得分:2)
如果需要按给定的id选择名称,那么还需要两件事 - 从结果中只选择一个元素,并获取此name元素的值:
string name = xdoc.Descendants("Staff")
.Elements("Name")
.Where(n => (string)n.Attribute("id") == inputPassword)
.Select(n => (string)n) // get element's value
.FirstOrDefault(); // select only first value, if any
或者使用XPath
string xpath = String.Format("//Staff/Name[@id='{0}']", inputPassword);
string name = (string)xdoc.XPathSelectElement(xpath);
答案 1 :(得分:0)
LINQ查询返回迭代器,要解决它,您需要添加另一个方法调用,如Single()
或ToList()
。尝试在调用结束时添加Single()
XDocument xdoc = XDocument.Load(Server.MapPath("Staff.xml"));
var result = xdoc.Descendants("Staff").Elements("Name").Where(n => n.Attribute("id").Value == inputPassword).Single();
nameLabel.Text = result.ToString();
您也可以使用SingleOrDefault()
来避免NRE
答案 2 :(得分:0)
如果你想获得idcode我会尝试这样的事情:
XDocument xdoc = XDocument.Load(Server.MapPath("Staff.xml"));
var result = xdoc.Descendants("Staff").Elements("idcode").Where(n => n.Value.ToString() == inputPassword).SingleOrDefault();
nameLabel.Text = result.ToString();