2010-08-23 25 views
6

tôi tạo ra một tập tin xml như thế này:làm thế nào để thêm/chèn nút có điều kiện vào XML sử dụng 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") 
      ) 
     ) 
    ); 

Sau đó tôi muốn thêm nút con mới dưới "kỷ lục" mẹ nút dựa trên một điều kiện (trong đó name = "peter"), một cái gì đó như thế này:

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

Làm cách nào để đạt được điều này?

+0

Nitpick: Thay vì '(string) r.Element (" Name ")', tôi khuyên bạn nên sử dụng 'r.Element (" Name "). Value' có thể có dạng tốt hơn. – Timwi

+2

@Timwi: Tôi sẽ không. Lợi thế của việc cast thành chuỗi là nó trả về null thay vì thổi lên khi cast từ null. Vì vậy, bất kỳ phần tử nào không có một phần tử con được gọi là Name chỉ bị bỏ qua, thay vì làm cho chương trình thất bại. Tôi gần như luôn luôn thích sử dụng các chuyển đổi rõ ràng trong LINQ to XML, trừ khi không tìm thấy một phần tử/thuộc tính nào được coi là đủ tồi để đảm bảo một ngoại lệ. –

+0

@Jon Skeet: Điểm công bằng. Tôi thừa nhận tôi đã không nghĩ về null, nhưng ngay cả khi tôi đã làm, nó không phải là rõ ràng rằng 'op_Explicit' chấp nhận nó và không ném. Nó cũng không rõ ràng những gì 'op_Explicit' làm gì nếu, ví dụ, phần tử có subelements, trong khi tài liệu cho thuộc tính' Value' rõ ràng hơn (haha, irony) về nó. – Timwi

Trả lời

2

Bạn đang gần ở đó, bạn ở đâu khoản trả về một IEnumerable<XElement> không phải là một XElement duy nhất, vì vậy bạn chỉ cần phải khắc phục điều đó, tức là gọi .Single() hoặc .First() vv

ví dụ:

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 đã gán Empfile. phần tử(). blahblah để xe và xe.add yếu tố mới, nhưng tôi thấy empFile đã được cập nhật là tốt, làm thế nào đến? – Kiddo

3

Cũng như đề xuất của Tim về việc sử dụng Where theo sau là Single hoặc First, bạn nên biết rằng có quá tải những phương pháp đã có biến vị ngữ. Ví dụ:

empFile.Elements() 
     .Single(r => (string) r.Element("Name") == "Peter") 
     .Add(...); 
Các vấn đề liên quan