XML读取,该如何解决

XML读取
<?xml version="1.0" encoding="GB2312"?>
<Server>
  <Project id="Tcdsb">
   <Qa>
   <Farm id="App01">
    <Username>cec\QASetup</Username>
    <Password>@$etup</Password>
    <address>APP01</address>
</Farm>
<Farm id="App02">
    <Username>cec\QASetup</Username>
    <Password>@$etup</Password>
    <address>APP01</address>
</Farm>
   </Qa>
  </Project>
  
  
    <Project id="Ecsd">
   <Qa>
   <Farm id="App01">
    <Username>cec\QASetup</Username>
    <Password>@$etup</Password>
    <address>APP01</address>
</Farm>
<Farm id="App02">
    <Username>cec\QASetup</Username>
    <Password>@$etup</Password>
    <address>APP01</address>
</Farm>
   </Qa>
  </Project>
</Server>


请教这xml的结构设计的合理吗?
请教怎么读取所有Project 的id?   也就是读出Tcdsb和Ecsd  
请教怎么读出所有Tcdsb下qa下Farm   也就是App02和App01
------解决方案--------------------

            string path = @"C:\1.xml";
            XDocument doc = XDocument.Load(path);
            var ele = doc.Element("Server").Elements().Where((XElement x) => x.Name.LocalName == "Project");
            foreach (var v in ele)
            {
                Console.WriteLine(v.Attribute("id").Value); //Project id
                var ele1 = v.Element("Qa").Elements().Where((XElement x) => x.Name.LocalName == "Farm").Select((XElement x) => x.Attribute("id").Value);
                foreach (var v1 in ele1)
                {
                    Console.WriteLine(v1); //Tcdsb下qa下Farm
                }
            }

------解决方案--------------------
使用linq  to  xml,
http://blog.****.net/duanzi_peng/article/details/24018431
------解决方案--------------------
用Xpath直接取就行了
------解决方案--------------------
XmlDocument xd = new XmlDocument();
 xd.LoadXml("test.xml");
 XmlNodeList xnl = xd.SelectNodes("Server/Project");
foreach(XmlNode xn in xnl)
{
     Console.write(xn.Attributes["id"].Value);
}
------解决方案--------------------
1.可以;
2.获取属性可以参考这样:
XmlDocument doc = new XmlDocument();
doc .Load(文件路径);
SelectNodes("/Server/Project/[@id]");   //这里要去看看xpath路径对没,太久没写忘记了属性是否如此写。
3.参考2 ,其实就是xpath路径问题"/Server/Project/qa/Farm";
   


------解决方案--------------------
读取XML文件
//获取XML中的数据
public static DataTable GetData(string path,string tableName)
{
            //创建XmlDocument类的实例
            XmlDocument xmldoc = new XmlDocument();
            //调用XmlDocument类中的Load()方法加载XML文件
            xmldoc.Load(path);
            //创建DataTable类型的变量dt
DataTable dt = new DataTable();
///获取根节点
            XmlNode rootNode = xmldoc.SelectSingleNode("/" + tableName + "s");
            //判断节点及其子节点是否为空,为空将返空值
if(rootNode == null) return null;
if(rootNode.ChildNodes.Count <= 0) return null;
///创建保存记录的数据列
foreach(XmlAttribute attr in rootNode.ChildNodes[0].Attributes)
{
dt.Columns.Add(new DataColumn(attr.Name,typeof(string)));
}
///创新获取数据节点的XPath
string xmlPath = "/" + tableName + "s/" + tableName;