如何循环遍历XML节点及其子节点以获取SQL和邮件地址



我正在尝试读取一个具有以下C#格式的xml。我必须将customer标记下的每个sqlText和mailbody内容以及每个电子邮件地址存储到一个字符串变量中,以便进一步处理。我在下面给出的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
}

要继续使用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();

最新更新