2009-10-01 70 views
0

以下是XML文檔的示例。XML與C#LINQ到XML

<People> 
    <Person> 
     <Name>ABC </Name> 
     <SSN>111111</SSN> 
     <Address>asdfg</Address> 
    </Person> 
</People> 

我需要獲取標記名稱,但不是標記名稱之間的值。也就是說,在人員標籤下,我應該抓取Name,SSNAddress節點,而不是ABC111111asdfg值。

我需要使用LINQ to XML並在C#中查詢。

我該怎麼辦?

+0

某些原因我的XML文檔示例沒有正確顯示在上面。 Basicaly。它有一個主要標籤People。在哪我有人標記。其中有名稱,SSN和地址標籤(每個都有值)。我需要獲取標籤名稱而不是值 – 2009-10-01 18:41:17

+0

已修復它! – Larsenal 2009-10-01 18:42:20

回答

4

這將返回名稱作爲字符串列表:

var doc = XDocument.Parse(@"<People> 
    <Person> 
     <Name>ABC </Name> 
     <SSN>111111</SSN> 
     <Address>asdfg</Address> 
    </Person> 
</People>" 
); 

var list = doc.Root.Element("Person").Descendants() 
       .Select(node => node.Name.LocalName).ToList(); 

如果你正在使用的XElement而不是一個XDocument,你可以從上面的代碼中刪除.Root,並得到正確的結果。

+1

+1是迄今爲止實際使用LINQ和LINQ to XML類的唯一答案。 – 2009-10-01 22:35:55

0

你可以這樣說...

string xml = "<People> <Person> <Name>ABC </Name> <SSN>111111</SSN> <Address>asdfg</Address> </Person> <Person> <Name>ABC </Name> <SSN>111111</SSN> <Address>asdfg</Address> </Person> </People>"; 

XElement xmlData = XElement.Parse(xml); 

foreach(XElement xmlPerson in xmlData.Elements("Person")) 
{ 
    List<string> TagsForThisPerson = new List<string>(); 
    foreach(XElement xmlTag in xmlPerson.Elements()) 
    { 
     TagsForThisPerson.Add(xmlTag.Name.ToString()); 
    } 
    TagsForThisPerson.Dump(); 
} 
1

創建一個類

public class Person 
{ 
    public string Name {get; set;} 
    public int SSN {get; set;} 
    public string Address {get; set;} 
} 

,並創建一個新的人這樣;

List<Person> NewPersons = new List<Person>(); 
XDocument doc = XDocument.Load(xmlFile);  
foreach(XElement xElem in doc.Descendants("Person")) 
{ 
    NewPersons.Add(new Person 
      { 
       Name = xElem. Element("Name").Value, 
       SSN = xElem.Element("SSN").Value, 
       Address = xElem.Element("Address").Value, 
      }); 
} 
0

簡單LINQ獲取名稱的語法如下所列。它假定您已將XML加載到名爲doc的XDocument變量中。

var nodeNames = from node in doc.Descendants("Person").First().Descendants() 
       select node.Name.LocalName; 

它只看第一個人。如果您在XML文檔中有多個名稱,則名稱列表可能不是您想要的(無需重複所有節點名稱)。通過這種方式,您可以得到第一個人的節點名稱列表,但它確實假定第一個人名將具有完整的名稱列表。如果它們有所不同,則需要從所有節點構建一個不同的列表。