【问题标题】:Loop through XML document using XPathNavigator使用 XPathNavigator 循环遍历 XML 文档
【发布时间】:2014-12-22 13:36:44
【问题描述】:

我有以下 XML,我正在尝试将值写入 CSV 文件。但是,我不确定如何继续进行,因为我尝试过的所有操作都会引发错误。以下返回:“表达式必须计算为节点集”。感谢您提供任何帮助。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<Envelope>
   <Body>
  <RESULT>
     <SUCCESS>TRUE</SUCCESS>
     <Mailing>
        <MailingId>9285984</MailingId>
        <ReportId>362040252</ReportId>
        <ScheduledTS>2014-08-22 11:44:33.0</ScheduledTS>
        <MailingName>305_ENDS</MailingName>
     </Mailing>
     <Mailing>
        <MailingId>9278770</MailingId>
        <ReportId>361956135</ReportId>
        <ScheduledTS>2014-08-22 09:15:00.0</ScheduledTS>
        <MailingName>141_TSI</MailingName>
        <Visibility>Shared</Visibility>
     </Mailing>
     <Mailing>
        <MailingId>9286460</MailingId>
        <ReportId>362043622</ReportId>
        <ScheduledTS>2014-08-22 12:57:30.0</ScheduledTS>
        <MailingName>301_BRANDREP</MailingName>
     </Mailing>
  </RESULT>
</Body>
</Envelope>

C#:

xpathDoc = HttpHelper.HttpStream(xmlReq, sessionid);

XPathNavigator nav = xpathDoc.CreateNavigator();

XPathNodeIterator xmlIterator = nav.Select("/Envelope/Body/RESULT/");

var csv = new StringBuilder();

filePath = "C:\Campaigns.csv";

foreach (XPathNavigator node in xmlIterator)
{

string MailingId = node.SelectSingleNode("MailingId").Value;
string ReportId = node.SelectSingleNode("ReportId").Value;
string ScheduledTS = node.SelectSingleNode("ScheduledTS").Value;
string MailingName = node.SelectSingleNode("MailingName").Value;

string newLine = string.Format("{0},{1},{2},{3},{4}", MailingId, ReportId, ScheduledTS, MailingName, Environment.NewLine);
csv.Append(newLine);

}

File.WriteAllText(filePath, csv.ToString());

【问题讨论】:

  • with everything I've tried throwing errors

标签: c# .net xml xpath


【解决方案1】:

嗯,你可以试试下面的方法:

foreach (XPathNavigator node in nav.Select("/Envelope/Body/RESULT/Mailing"))
{
    string MailingId = node.SelectSingleNode("./MailingId").Value;
    // and so on

注意:它应该完全是 Mailing 而不是 RESULT 在您的查询中,并且应该 / 结尾

【讨论】:

  • 谢谢。有用!顺便说一句,“./MailingId”和使用“MailingId”有什么区别?
  • @stats101 实际上,在这种特殊情况下没有区别。前缀./在xpath中表示“选择从当前节点相对开始”。
【解决方案2】:

XPathNavigator node in nav.Select("/Envelope/Body/RESULT/") 更改为XPathNavigator node in nav.Select("/Envelope/Body/RESULT/Mailing"),然后使用例如string MailingId = node.SelectSingleNode("MailingId").Value;.

【讨论】:

    猜你喜欢
    • 2013-01-26
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2021-11-12
    • 2019-07-07
    相关资源
    最近更新 更多