无法在XML文档中获取完整的用户详细信息

时间:2013-05-29 11:30:52

标签: c# xml xpath

首先,我向您展示我的XML文档,然后我想使用C#代码读取这些值,但在这里我收到了一个用户名usr&密码仅限pwd。

<Users>
  <user>
    <username>abc</username>
    <password>def</password>
  </user>
  <user>
    <username>usr</username>
    <password>pwd</password>
  </user>
</Users>

Java代码:

 private void Form1_Load(object sender, EventArgs e)
    {

        XmlDocument xDoc = new XmlDocument();
        xDoc.Load(Application.StartupPath+"\\load.xml");

        foreach (XmlNode node in xDoc.SelectNodes("//Users/user"))
        {
            string Username = node.FirstChild.InnerText;
            string Password = node.LastChild.InnerText;


          // Some coding goes here
        }

    }

我需要两个用户详细信息。我的XPath查询有什么问题?

4 个答案:

答案 0 :(得分:1)

因为每次设置UsernamePassword时,您都会创建立即超出范围的新变量(具体取决于Some coding goes here实际上/是什么)。创建一些更高级别的范围变量并将值存储在那里,但即使这样,您每次都会覆盖相同的值,因此最终仅使用最后一个凭证集 - 因此,使用集合将它们存储在其中。

var credentials = new List<KeyValuePair<string, string>>();

credentials.Add(new KeyValuePair<string, string>(
  node.FirstChild.InnerText, node.LastChild.InnerText)
);

如果您正在使用循环中查询的值进行操作,那么我可以立即纠正,但不清楚 您希望使用这些(例如重复使用)如果是这种情况,那么 - 变量可能是完全有效的。)

答案 1 :(得分:1)

尝试

var xDoc= XDocument.Load(Application.StartupPath+"\\load.xml");

var userlist = xDoc.Descendants("users").Descendants("user")
            .Select(u => new {
                                Username = u.Element("username").Value,
                                Password = u.Element("password").Value
                            }).ToList();

答案 2 :(得分:1)

您可以使用XmlSerializer来提取元素。

类:

[XmlRoot("users")]
public class UserResult
{
    [XmlElement("user")]
    public List<User> Users { get; set; }
}

public class User
{
    [XmlElement("username")]
    public string UserName { get; set; }

    [XmlElement("password")]
    public string Password { get; set; }
}

用法:

var xml = @"<users>
<user>
<username>abc</username>
<password>def</password>
</user>
<user>
<username>usr</username>
<password>pwd</password>
</user>
</users>";

var document = new XmlDocument();
document.LoadXml(xml);

UserResult result;
var serializer = new XmlSerializer(typeof(UserResult));

using(var reader = new StringReader(xml))
{
    result = serializer.Deserialize(reader);
}

答案 3 :(得分:0)

public List<UserDetails> GetUserDetails()
        {
            XDocument xDOC = XDocument.Load(Application.StartupPath+"\\load.xml");
            List<UserDetails> retVal = (from xele in xDOC.Descendants("User")
                                        select new UserDetails
                                        {
                                            UserName = xele.Element("username").Value,
                                            Password = xele.Element("password").Value
                                        }).ToList<UserDetails>();

            return retVal;

        }
    }

    public class UserDetails
    {
        public string UserName { get; set; }
        public string Password { get; set; }
    }