如何使用linq解析xml文件?

时间:2014-06-06 20:12:26

标签: c# xml linq linq-to-xml xmlreader

这是我的xml文件: -

<?xml version="1.0" encoding="utf-8" ?>
<Ftpservers>
  <Ftpserver>
    <Name>Client1</Name>
    <ServerIP>10.10.10.100:1961</ServerIP>
    <UserName>username</UserName>
    <Password>pa$#word1</Password>
    <EnableSSL>false</EnableSSL>
    <UsePassive>false</UsePassive>
</Ftpserver>
  <Ftpserver>
    <Name>Client2</Name>
    <ServerIP>10.10.10.101:1961</ServerIP>
    <UserName>username</UserName>
    <Password>pa$#word1</Password>
    <EnableSSL>false</EnableSSL>
    <UsePassive>false</UsePassive>
  </Ftpserver>
</Ftpservers>

这是我的c#代码: -

    public class FtpInfo
        {
            public string Name { get; set; }
            public string ServerIp { get; set; }
            public string UserName { get; set; }
            public string Password { get; set; }
            public bool EnableSsl { get; set; }
            public bool UsePassive { get; set; }
        }

var xmlReader = XDocument.Load("FtpDestination.xml");
var servers = (from f in xmlReader.Descendants("FtpServer")
            select new FtpInfo
            {
                Name = f.Element("Name").Value,
                ServerIp = f.Element("ServerIP").Value,
                UserName = f.Element("UserName").Value,
                Password = f.Element("Password").Value,
                EnableSsl = Convert.ToBoolean(f.Element("EnableSSL").Value),
                UsePassive = Convert.ToBoolean(f.Element("UsePassive").Value)
            }).ToList<FtpInfo>();
foreach(var server in servers)
    Console.Write(server.Name);

我正在尝试使用xdocument类读取xml文件。但无法找到我的服务器数量总是为零的原因。代码不会抛出任何错误,但根本不会读取xml数据。 请指教?

3 个答案:

答案 0 :(得分:3)

您的代码有两个问题,

  1. 首先,代码中的Ftpserver不是FtpServer(注意小写服务器)
  2. 其次,您正在使用Name UsePassive
  3. 排队:

    UsePassive = Convert.ToBoolean(f.Element("Name").Value)
    

    应为UsePassive

    UsePassive = Convert.ToBoolean(f.Element("UsePassive").Value)
    

    最后,虽然这不是错误,但您不需要.ToList<FtpInfo>();只有ToList就足够了。

    所以你的陈述应该是:

    var servers = (from f in xmlReader.Descendants("Ftpserver")
                   select new FtpInfo
                   {
                       Name = f.Element("Name").Value,
                       ServerIp = f.Element("ServerIP").Value,
                       UserName = f.Element("UserName").Value,
                       Password = f.Element("Password").Value,
                       EnableSsl = Convert.ToBoolean(f.Element("EnableSSL").Value),
                       UsePassive = Convert.ToBoolean(f.Element("UsePassive").Value)
                   }).ToList();
    

答案 1 :(得分:2)

UsePassive在布尔转换中失败,从Name更改为UsePassive

答案 2 :(得分:2)

您的Xml节点是&#34; Ftpserver&#34;但是你正在查询&#34; FtpServer&#34;。因此查询返回零结果元素。