2009-10-01 67 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文档中有多个名称,则名称列表可能不是您想要的(无需重复所有节点名称)。通过这种方式,您可以得到第一个人的节点名称列表,但它确实假定第一个人名将具有完整的名称列表。如果它们有所不同,则需要从所有节点构建一个不同的列表。