2016-06-28 32 views
1

私は従業員が関連付けられているいくつかのグループを調べて、そのグループをXMLの要素として追加できるように、特定の従業員IDをXMLファイルから取得しようとしています。XMLにLinqを使用してXML属性値を取得する方法は?

まず、従業員IDが必要なので、情報を参照して取得する方法を理解できません。私はすべてのネストされたノードのために私はそれを取得していないと思います。

ここに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には 'Emp'要素の下にそのような属性はありません。 –

+0

が編集されました。同じ値を持つ2つの属性があります。投稿されたコードを減らすためにいくつかの属性を整えました。 – 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の内側にあると思いますので、私はそれを仮定します。

次の操作を行うことができます属性で従業員を取得するには:

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

これはgroupsを想定している:ちょうどAddメソッドを使用して、現在の従業員にグループを追加するには、[今すぐ

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

変数はIEnumerable<Group>

+0

私はこの問題に取り組んでいたので、最終的に私はこの問題に取り組んでいた方法を変えなければならないので、最終的にはこれを変えなければならないかもしれないので、私はderloopkatを答えとしてマークしました。従業員のリストを使用し、その属性に基づいてノードを見つけてから、グループノードを追加する必要があります。 – Caverman

+0

私はXMLにLinqの代わりにXmlDocumentに戻ることを含むすべてを変更する必要があるかもしれません。条件付きのチェックがあるので、最初はLinq to XMLを使用して従業員を書き出してから、グループを見るためにファイルをロードしていました。 XmlDocumentでは、各ノードを個別に書き出すことができます。おそらくLinqを使ってXMLにすることもできますが、何も見つけられていないので、今日これを終わらせなければなりません。 – Caverman

+0

Linq2XMLを使って要素を追加したときに何が問題になっているのか分かりません。かなり簡単です。あなたが現在の問題をあなたと一緒に新しい質問を追加したい場合は、私に見てみましょう – octavioccl

関連する問題