【问题标题】:get xml node value from id attribute c#从 id 属性 c# 获取 xml 节点值
【发布时间】:2014-05-13 15:44:22
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    如果您需要通过给定的 id 选择名称,那么您还需要两件事 - 从结果中仅选择一个元素,并获取此名称元素的值:

    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);
    

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

        【解决方案3】:

        如果你想获得 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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-14
          • 2021-11-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多