2015-07-10 3 views
0
XElement doc = null; 
doc = new XElement("root"); 
foreach (var content in emailContents) 
            { 
    doc.Add(new XElement("Email", 
      new XElement("FromAddress", content.FromAddress), 
      new XElement("EmailReceivedOn", content.receivedOnemail), 
      new XElement("Subject", content.subject), 
      new XElement("Body", content.body))); 
    // I want to add the below code after the body element is created in the xml inside the email element section; How to do the same? 
    foreach (var attachment in content.attachments) 
     { 
      doc.Add(new XElement("attachmentname"), attachment.Filename), 
      doc.Add(new XElement(("attachmentpath"), attachment.Filepath)   
     } 
} 

В основном content.attachment представляет собой список вложений, и я хочу добавить список сразу после элемента body. Как сделать то же самое?Как использовать цикл foreach внутри Xelement в C#

+0

Просто присвойте 'var email = new XElement (« Email », ...);' затем добавьте его в 'doc', затем добавьте вложения к нему? – dbc

ответ

3

Это довольно легко сделать это на одном дыхании:

var doc = 
    new XElement("root", 
     new XElement("Email", 
      new XElement("FromAddress", content.FromAddress), 
      new XElement("EmailReceivedOn", content.receivedOnemail), 
      new XElement("Subject", content.subject), 
      new XElement("Body", content.body), 
      content.attachments.Select(attachment => 
       new XElement("attachment", 
        new XElement("attachmentname", attachment.Filename), 
        new XElement("attachmentpath", attachment.Filepath))))); 

Я начал с этой выборки данных:

var content = new 
{ 
    FromAddress = "FromAddress", 
    receivedOnemail = "receivedOnemail", 
    subject = "subject", 
    body = "body", 
    attachments = new [] 
    { 
     new 
     { 
      Filename = "Filename", 
      Filepath = "Filepath", 
     }, 
    }, 
}; 

И я получил этот XML:

<root> 
    <Email> 
    <FromAddress>FromAddress</FromAddress> 
    <EmailReceivedOn>receivedOnemail</EmailReceivedOn> 
    <Subject>subject</Subject> 
    <Body>body</Body> 
    <attachment> 
     <attachmentname>Filename</attachmentname> 
     <attachmentpath>Filepath</attachmentpath> 
    </attachment> 
    </Email> 
</root> 
+0

Я получаю эту ошибку -> Этот метод не поддерживается против материализованного результата запроса. –

+1

@rohitsingh, если список является запросом из базы данных, попробуйте использовать '.ToList()' на нем перед использованием 'Select()'. – Default

+0

спасибо, работая сейчас –

1

Вы добавляете прикрепление к корневому элементу вместо добавления в элемент электронной почты. вы можете сделать это следующим образом.

XElement doc = null; 
doc = new XElement("root"); 
doc.Add(new XElement("Email", 
     new XElement("FromAddress", content.FromAddress), 
     new XElement("EmailReceivedOn", content.receivedOnemail), 
     new XElement("Subject", content.subject), 
     new XElement("Body", content.body))); 
var email=doc.Element("Email"); // get email element from root Element 
foreach (var attachment in content.attachments) 
    { 
     //Add attachemnt information to email element. 
     email.Add(new XElement("attachmentname"), attachment.Filename), 
     email.Add(new XElement(("attachmentpath"), attachment.Filepath)   
    } 
Смежные вопросы