2016-12-12 12 views
2

特定のXAttributeとXElementを検索しようとしています。C#XMLの検索と置換

<IcMDetails ServerGroup="ABC"> 
    <IncidentId>984513515</IncidentId> 
    <Title>today is a great day</Title> 
    <Description>this is a test</Description> 
    <State>Active</State> 
    <Severity>2</Severity> 
    <DateCreated>2016-12-12</DateCreated> 
    </IcMDetails> 
<IcMDetails ServerGroup="XYZ"> 
    <IncidentId>6845613</IncidentId> 
    <Title>today is a great day</Title> 
    <Description>this is a test</Description> 
    <State>Active</State> 
    <Severity>2</Severity> 
    <DateCreated>2016-12-08</DateCreated> 
    </IcMDetails> 
<IcMDetails ServerGroup="ABC"> 
    <IncidentId>12345345</IncidentId> 
    <Title>today is a great day</Title> 
    <Description>this is a test</Description> 
    <State>Resolved</State> 
    <Severity>2</Severity> 
    <DateCreated>2016-12-08</DateCreated> 
    </IcMDetails> 

ここで、私は特定の子レコードが見つかったら はのServerGroupは= ABC 状態=アクティブ

、私は状態を更新します。

public static void Update() 
    { 
    string filePath = "XML.xml" 
    XDocument doc = XDocument.Load(filePath); 

    var items = from i in doc.Descendants("IcMDetails") 
     select i; 

     foreach(var item in items) 
     { 
      item.Element("State").Value = "NewValue"; 
     } 
    } 

私は次のようにXMLファイルを読みました。しかし、私はXAttribute値を読み取ることができません。

のXML LINQを使用して
public static void Read() 
    { 
     XmlTextReader reader = new XmlTextReader("TFS_Tickets.xml"); 

     while (reader.Read()) 
     { 
      switch (reader.NodeType) 
      { 
       case XmlNodeType.Element: // The node is an element. 
        Console.Write("<" + reader.Name); 
        Console.WriteLine(">"); 
        break; 
       case XmlNodeType.Attribute: 
        Console.WriteLine(reader.Value); 
        break;       
       case XmlNodeType.Text: //Display the text in each element. 
        Console.WriteLine(reader.Value); 
        break; 
       case XmlNodeType.EndElement: //Display the end of the element. 
        Console.Write("</" + reader.Name); 
        Console.WriteLine(">"); 
        break; 
      } 
     } 

答えて

1

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 
      var results = doc.Descendants("IcMDetails").Where(x => (string)x.Element("State") == "Active").ToList(); 

     } 
    } 
} 
0

それはあなたがそれらを更新し、あなたの基準によって要素をフィルタリングするためにLINQのEnumerable.Whereを使用することができ、非常に単純です。あなたはまた、query syntaxで同じクエリを書くことができ

var details = doc.Descendants("IcMDetails") 
    .Where(x => (string) x.Attribute("ServerGroup") == "ABC" && 
       (string) x.Element("State") == "Active"); 

foreach (var detail in details) 
{ 
    detail.SetElementValue("State", "NewValue"); 
} 

var details = 
    from item in doc.Descendants("IcMDetails") 
    where (string) item.Attribute("ServerGroup") == "ABC" && 
      (string) item.Element("State") == "Active" 
    select item; 

は、作業のデモ用this fiddleを参照してください。