2016-06-28 109 views
1

我试图从XML文件中取出特定的员工ID,以便查找员工关联的某些组,然后将这些组作为元素添加到XML中。如何使用Linq to XML获取XML属性值?

首先,我需要employeeId,然后我可以查找一些信息,但我不了解如何获取它。我猜我没有得到它,因为所有的嵌套节点。

这里是XML结构。

<CXIXML> 
    <Directives> 
    <Updates> 
     <Emp tasEmpID="00123" lName="Doe" fName="John" empStatus="A" city="HDQ" /> 
     <Emp tasEmpID="00456" lName="Smith" fName="Jane" empStatus="A" city="HDQ" /> 
    </Updates> 
    </Directives> 
</CXIXML> 

这是我试过但我没有得到的ID。

private static void SetGroupAssociations(string xmlFile) 
     { 
      XElement xelement = XElement.Load(xmlFile); 
      IEnumerable<XElement> employees = xelement.Elements(); 
      foreach (var employee in employees) 
      { 
       var employeeId = from e in employee.Descendants("Emp") 
           select new 
           { 
            Id = e.Element("tasEmpID") 
           }; 

       Console.WriteLine(employeeId); 
      } 
     } 

最终我需要最终得到类似下面的内容。因此,关于如何在特定员工节点之后添加新元素的任何建议都会很好,但首先我至少要让员工查看他们的团队。

<CXIXML> 
    <Directives> 
    <Updates> 
     <Emp tasEmpID="00123" lName="Doe" fName="John" empStatus="A" city="HDQ" /> 
     <Group groupId="1"> 
     <Group groupId="5"> 
     <Group groupId="12"> 
     <Emp tasEmpID="00456" lName="Smith" fName="Jane" empStatus="A" city="HDQ" /> 
     <Group groupId="1"> 
    </Updates> 
    </Directives> 
</CXIXML> 
+1

您是否发布了相关的xml数据?你的C#代码尝试从“sharpID”元素中获取值,但是在你的XML中没有这样的属性。 –

+0

已编辑。有几个属性具有相同的值。我修剪了一些属性以减少发布的代码。 – Caverman

+0

看看我写给你的答案。 –

回答

1

这看起来与您已有的相似。然后在foreach中,您可以将句子添加到您的流程中。

var document = XDocument.Load(xmlFile); 
var employees = document.Descendants("Emp"); 
foreach (var employee in employees) 
{ 
    var employeeId = employee.Attribute("tasEmpID").Value; 
    Console.WriteLine(employeeId); 
} 

我已经把文件中单独的变量,这样你就可以使用这个对象来保存更改。

+0

谢谢,这工作。 – Caverman

1

我想你的xml结构是不正确的,你描述的小组将在每个Emp内部,所以我将假设这一点。

要获取的属性的员工,你可以做到以下几点:

XElement xelement = XElement.Load(xmlFile); 
var emp=xelement.Descendants("Emp") 
       .FirstOrDefault(e=>(string)e.Attribute("tasEmpID")=="00456"); 

我们组添加到当前的员工,只要使用Add方法:

emp.Add(groups.Select(g=>new XElement("Group",new XAttribute("groupId",g.Id)))); 

这是假设groups变量是IEnumerable<Group>

+0

我标记derloopkat作为答案,因为它做了我在问的问题,但是,最终我可能不得不使用这种变化,因为我可能不得不改变我解决这个问题的方式。我可能必须使用员工列表,根据属性找到他们的节点,然后添加组节点。 – Caverman

+0

我可能不得不改变一切,包括回到XmlDocument而不是Linq到XML。由于需要进行一些条件检查,我最初使用Linq to XML来写出员工,然后加载文件以查看组。使用XmlDocument,我可以单独写出每个节点。它可以用Linq to XML来完成,但是我没有找到任何东西,我必须在今天完成。 – Caverman

+0

我没有看到你发现使用Linq2XML添加元素的问题。它非常简单。如果您喜欢在当前问题中添加一个新问题,请让我知道该查看一下 – octavioccl