Как выполнить цикл через узел XML и его дочерний узел, чтобы получить SQL и почтовый адрес

#c# #xml

#c# #xml

Вопрос:

Я пытаюсь прочитать xml со следующим форматом, приведенным ниже в C #. Я должен сохранить каждый текст sql и содержимое почтового ящика и каждый адрес электронной почты в теге customer в строковую переменную для дальнейшего процесса. Формат XML, который я привел ниже

     <?xml version="1.0" encoding="utf-8" ?>
<Queries>
    <Customer>
        <SQL ID="GYSQL">
            Select * from customer where code ='GYSQL'
        </SQL>
        <MailBody>
              Please find  the Report GY
        </MailBody>
        <Address>customer1@mail.com</Address>
        <Address>customer2@mail.com</Address>
    </Customer>
    <Customer>
        <SQL ID="TSSQL">
            Select * from customer where code ='TSSQL'
        </SQL>
        <MailBody>
              Please find  the Report TS
        </MailBody>
        <Address>customer3@mail.com</Address>
        <Address>customer4@mail.com</Address>
        <Address>customer5@mail.com</Address>
    </Customer>
</Queries>
 

Я должен перебирать каждый тег клиента

   var xml = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)   "\xml\sql.xml";
                XmlDocument xml1 = new XmlDocument();
                xml1.Load(xml);
                XmlNodeList list = xml1.SelectNodes(@"//Customer");
                foreach (XmlNode xn in list)
                {
                    
                    string Sql = Get the text from SQL tag under Customer
                    string mailbody = Get the text under tag CustomerMailbody
                    //Here I have to get each email address in a loop in a string variable

                }
 
 

Комментарии:

1. попробуйте xn.value ….

2. @PeterMarshall Это значение узла клиента, а не то, что хочет плакат.

Ответ №1:

Чтобы продолжить работу с выражениями XPath, вы могли бы сделать что-то вроде этого:

 foreach (XmlNode xn in list)
{   
    // Find the first child node of 'xn' with name "SQL"
    var sqlForThisCustomer = xn.SelectSingleNode("SQL")?.InnerText;
    // Same for "MailBody"
    var mailBodyForThisCustomer = xn.SelectSingleNode("MailBody")?.InnerText;   

    var addressList = xn.SelectNodes("Address");
    foreach(XmlNode adr in addressList) {
        var currentAddress = adr.InnerText;     
    }
}
 

Для такого рода работы я обычно предпочитаю XDocument :

 var doc = XDocument.Parse(xmlstring);
var customers = doc.Root
            .Elements("Customer")
            .Select(c => new {
                SQL = c.Element("SQL")?.Value,
                MailBody = c.Element("MailBody")?.Value,
                Addresses = c.Elements("Address").Select(x => x.Value).ToList()
            })
            .ToList();
 

Комментарии:

1. Как я могу получить каждый адрес электронной почты под тегом <Адрес>

2. Добавил это к примеру сейчас, я как-то пропустил ваш комментарий в вопросе.