-1

首先在这里我向您展示我的 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

4 回答 4

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();
于 2013-05-29T11:37:35.223 回答
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);
}
于 2013-05-29T11:50:33.457 回答
1

因为每次您设置Username并且Password您正在创建立即超出范围的新变量(取决于Some coding goes here实际是/所做的)。创建一些更高级别的范围变量并将值存储在那里,但即便如此,您每次都会覆盖相同的值,因此仅以最后一个凭据集结束 - 因此,使用集合来存储它们。

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

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

如果您正在对循环中的查询值做一些事情,那么我可以纠正,但不清楚您希望在哪里使用这些(例如,如果是这种情况,重用紧密范围的变量可能是完全有效的)。

于 2013-05-29T11:34:36.810 回答
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; }
    }
于 2013-05-30T07:23:10.987 回答