我正在尝试使用C#解析对SOAP请求的响应中的一些数据。响应具有Soap Envelope,而Soap Body包含来自系统的响应。响应包括一个标题,然后包含来自原始请求的一堆重复的XML信息块。请求是获取任务列表的状态,响应列出每个任务,状态和一些其他信息。这是一个模拟的样本。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<GetTaskStatusResponse xmlns="http://tasktracker.com/2011">
<ResponseHead>
<ResponseId>345234523452346</ResponseId>
<Timestamp>2014-11-05T09:23:51-06:00</Timestamp>
</ResponseHead>
<TaskStatusList>
<TaskStatus>
<TaskId>20141155448</AckId>
<FilingId>672</FilingId>
<Status>COMPLETE</Status>
</TaskStatus>
<TaskStatus>
<TaskId>20141135448</AckId>
<FilingId>673</FilingId>
<Status>COMPLETE</Status>
</TaskStatus>
<TaskStatus>
<TaskId>20141154878</AckId>
<FilingId>674</FilingId>
<Status>ERROR</Status>
<ErrorList>
<Error>34-5</Error>
<Error>34-6</Error>
<Error>77-8</Error>
</ErrorList>
</TaskStatus>
<TaskStatus>
<TaskId>20154448</AckId>
<FilingId>675</FilingId>
<Status>COMPLETE</Status>
</TaskStatus>
</TaskStatusList>
.... ....
到目前为止,我已经能够加载文件并将soapevn的第一个命名空间添加到命名空间管理器
nm.AddNamespace("soapenv", "http://schemas.xmlsoap.org/soap/envelope/");
当我尝试选择单个节点时,这可以:
XmlNode node = xml.SelectSingleNode("/soapenv:Envelope/soapenv:Body", nm);
但是当我尝试深入探测时,我找不到任何节点。
XmlNode node = xml.SelectSingleNode(
"/soapenv:Envelope/soapenv:Body/GetTaskStatusResponse/", nm);
if (node == null)
{
Console.WriteLine("No node found.");
}
else
{
Console.WriteLine("Found Node");
Console.WriteLine(node.Value);
Console.WriteLine(node.InnerText);
我假设这是因为这个元素:
<GetSubmissionStatusResponse xmlns="http://tasktracker.com/2011">
我尝试将带有“”或empty.String的条目与关联的Uri(http://tasktracker.com/2011)一起添加到命名空间管理器对象,我没有解决我的问题。我的最终目标是解析重复任务列表并将这些细节转储到表中。所以一旦我通过这个障碍,我相信我需要弄清楚如何循环重复节点的块。