2012-11-11 108 views
0

我正在試圖查詢一個xml文檔,但是這段代碼沒有讀取帶有封閉標記符號的xml部分,但是讀取的是很好的xelement。任何人都可以發現我做錯了什麼嗎?查詢XML文檔

我有程序生成的XML文件,該文件因此它現在的問題給出了封閉的標記文件..

<?xml version="1.0" encoding="utf-8" ?> 
<Student> 

<Person name="John" city="Auckland" country="NZ" /> 

<Person> 
    <Course>GDICT-CN</Course> 
    <Level>7</Level> 
    <Credit>120</Credit> 
    <Date>129971035565221298</Date> 
</Person> 
<Person> 
    <Course>GDICT-CN</Course> 
    <Level>7</Level> 
    <Credit>120</Credit> 
    <Date>129971036040828501</Date> 
</Person> 
</Student> 
class Program 
{ 
    static void Main(string[] args) 
    { 
     XDocument xDoc = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "Customers.xml"); 
     IEnumerable<XElement> rows = from row in xDoc.Descendants("Person") select row; 

     foreach(XElement xEle in rows) 
     { 
     IEnumerable<XAttribute>attlist = from att in xEle.DescendantsAndSelf().Attributes() select att; 

      foreach(XAttribute xatt in attlist) 
      { 
      Console.WriteLine(xatt); 
      } 
      Console.WriteLine("-------------------------------------------"); 
     } 
     Console.ReadLine(); 

    } 
} 

回答

0

既然你已經添加Course和其他屬性爲XElement,所以你需要在XElements循環而不是屬性 -

foreach (XElement xEle in rows) 
{ 
    IEnumerable<XAttribute> attlist = from att in xEle.DescendantsAndSelf() 
             .Attributes() select att; 

    foreach (XAttribute xatt in attlist) 
    { 
     Console.WriteLine(xatt); 
    } 
    foreach (XElement elemnt in xEle.Descendants()) 
    { 
     Console.WriteLine(elemnt.Value); 
    } 
    Console.WriteLine("-------------------------------------------"); 
} 
+0

這就像魅力..我想了解它做什麼區別,可你只是breif我,如果你不介意的話。謝謝。 –

+0

'XAttribute'用於屬性,而'XElement'用於子節點。在第一行中,你已經聲明瞭'name','city'和'country'as屬性。但在接下來的兩行中,你已經創建了子節點,這就是爲什麼你需要遍歷'Descendants'collection來獲取它們的值。 –

+0

謝謝,如果我想過濾下來的值我不能使用下面的過濾器代碼獲取子元素值,你可以檢查以及? IEnumerable rows = from xDoc.Descendants(「Person」)中的行 where(string)row.Attribute(「Level」)==「7」 select row; –

0

首先,您必須導航到人級別並遍歷人員,然後爲每個人可以迭代t通過它的屬性。

private static void Main(string[] args) 
    { 
     //string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
     //XDocument xDoc = XDocument.Load(path + "\\Student Data\\data.xml"); 
     XDocument xDoc = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "Customers.xml"); 
     IEnumerable<XElement> xElements = xDoc.Descendants("Person"); 
     foreach (XElement element in xElements) 
     { 
      foreach (XAttribute attribute in element.Attributes()) 
      { 
       Console.WriteLine(attribute); 
      } 
      Console.WriteLine("-------------------------------------------"); 
     } 
     Console.ReadLine(); 
    }