从id属性c#获取xml节点值

时间:2014-05-13 15:44:22

标签: c# xml linq linq-to-xml asp.net-4.5

我有一个登录页面,用户从下拉列表中选择他们的名字,然后在文本框中输入他们的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节点的子节点? 感谢。

3 个答案:

答案 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();