2010-08-23 14 views
6

ho generato un file XML in questo modo:come aggiungere/inserire nodo condizionale in XML utilizzando LINQ to XML

XElement employees = 
     new XElement("Work", 
      new XElement("record", 
       new XElement("Name", textBox1.Text), 
       new XElement("Phone", "206-555-0144"), 
       new XElement("Address", 
        new XElement("Street1", "123 Main St"), 
        new XElement("City", "Mercer Island"), 
        new XElement("State", "WA"), 
        new XElement("Postal", "68042") 
      )), 
      new XElement("record", 
       new XElement("Name", "22222"), 
       new XElement("Phone", "353245345"), 
       new XElement("Address", 
        new XElement("Street1", "sdfain St"), 
        new XElement("City", "asdf Island"), 
        new XElement("State", "QLD"), 
        new XElement("Postal", "54322") 
      )), 
       new XElement("record", 
       new XElement("Name", "Peter"), 
       new XElement("Phone", "1234"), 
       new XElement("Address", 
        new XElement("Street1", "sd St"), 
        new XElement("City", "cbr"), 
        new XElement("State", "act"), 
        new XElement("Postal", "2600") 
      ) 
     ) 
    ); 

tardi desidero aggiungere nuovo nodo bambino di età inferiore genitore nodo "record" sulla base di una condizione (dove name = "peter"), qualcosa del genere:

empFile.Elements().Where(r => (string)r.Element("Name") == "Peter") 
        .Add(new XElement("record", 
          new XElement("Mobile", "3253425"), 
          new XElement("Work", 999999) 
         )); 

Come posso ottenere questo?

+0

Nitpick: Invece di '(stringa) r.Element ("Nome")', vorrei suggerire che l'uso di 'r.Element ("Nome") Value' potrebbe essere migliore forma.. – Timwi

+2

@Timwi: non lo farei. Il vantaggio del cast to string è che restituisce un valore nullo invece di esplodere quando viene lanciato da null. Quindi qualsiasi elemento senza un sottoelemento chiamato Nome viene semplicemente ignorato, invece di causare il fallimento del programma. Preferisco quasi sempre utilizzare le conversioni esplicite in LINQ in XML, a meno che l'errore di trovare un elemento/attributo debba essere considerato abbastanza grave da giustificare un'eccezione. –

+0

@Jon Skeet: punto giusto. Ammetto che non ho pensato a null, ma anche se l'avessi fatto, non è ovvio che op_Explicit' lo accetti e non lo faccia. Inoltre, non è ovvio cosa sia 'op_Explicit' se, ad esempio, l'elemento ha dei sottoelementi, mentre la documentazione per la proprietà' Value' è più esplicita (haha, l'ironia) su di essa. – Timwi

risposta

2

Siete quasi arrivati, il tuo clausola Where restituisce un IEnumerable<XElement> non un singolo XElement, quindi non vi resta che riparare quello, cioè chiamare La singola() o .Prima() ecc

esempio:

XElement xe = empFile.Elements().Where(r => (string)r.Element("Name") == "Peter").Single(); 

xe.Add(new XElement("record", new XElement("Mobile", "3253425"), new XElement("Work", 999999)); 
+0

u hai assegnato Empfile. elementi(). blahblah a xe e xe.add nuovi elementi, ma ho trovato che empFile è stato aggiornato, come mai? – Kiddo

3

Così come il suggerimento di Tim di utilizzare Where seguito da Single o First, vale la pena sapere che ci sono sovraccarichi di quei metodi che hanno già dei predicati. Per esempio:

empFile.Elements() 
     .Single(r => (string) r.Element("Name") == "Peter") 
     .Add(...);