使用XmlNodeList与多个web服务调用
本文关键字:web 服务 调用 XmlNodeList 使用 | 更新日期: 2023-09-27 18:13:16
我正在构建一个调用3个不同web服务的控制台应用程序。第一个用项目id、项目状态和项目名称调用所有项目。
第一个web服务获得所有projectsid GetProjectData()
,并且调用是正确的。我把结果放入一个csv文件。
第二个调用,GetProjectDetails()
,它为我提供了所有项目的dataset
(在数据集中有许多值)。
这个调用包含projectType (Open或close),我需要把它放在GetProjectData()调用旁边。
这是GetProjectDetails数据集调用的模式:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Table">
<xs:complexType>
<xs:sequence>
<xs:element name="ProjectID" type="xs:string" minOccurs="0" />
<xs:element name="Title" type="xs:string" minOccurs="0" />
<xs:element name="ProjectType" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
我需要获得ProjectType并将其分配给我的项目,该项目将显示打开或关闭。
我创建了一个方法来解析xml输出:
public static string parseXML(System.Data.DataSet ds)
{
string txt = "";
XmlDocument xml = new XmlDocument();
xml.LoadXml(ds.GetXml());
XmlNodeList elements = xml.SelectNodes("/NewDataSet/Table");
foreach (XmlNode elem in elements)
{
txt += elem["ProjectType"].InnerText;
txt += "'n";
}
return txt;
}
我有另一个web服务调用,但我对那个调用是正确的,因为我有预期的输出。
问题是我需要将projecType提取到最终结果中,并根据每个项目类型打开或关闭。
这是我的代码。
string path = @"c:'testList";
try
{
string List = "listOfProjects";
string outCsvFile = string.Format(@"C:''testList''{0}.csv", List + DateTime.Now.ToString("_yyyyMMdd HHmms"));
//This is the call to get all the projects
WS.ProjectData[] pr = db.GetAllProjectData();
using (StreamWriter file = new StreamWriter(fs))
{
file.WriteLine("ProjectID, ProjectTitle,PublishStatus,Type,ProjectStartDate,ProjectEndDate");
foreach(WS.ProjectMetaData proj in pr.Distinct(new ProjectEqualityComparer()))
{
string language = "";
var userIDs = db.GetList(proj.ProjectID);
var projectInfo = parseXML(db.GetProjectDetails(language)); //GetProjectDetails require a string into the method
file.WriteLine("{0},'"{1}'",{2},{3},{4},{5}",
proj.ProjectID,
proj.ProjectTitle,
proj.PublishStatus,
userIDs.Length.ToString(NumberFormatInfo.InvariantInfo),
proj.ProjectStartDate.ToString(DateTimeFormatInfo.InvariantInfo),
proj.ProjectEndDate.ToString(DateTimeFormatInfo.InvariantInfo),
}
}
你能帮我把ProjectType输出到最后的结果吗?我想我需要以某种方式对projectInfo做一些事情,并使用projectInfo引用它,以便它可以知道它的类型是open还是close。
感谢输出预期:
ProjectID, ProjectTitle, PublishStatus,Type,ProjectStartDate,ProjectEndDate
7bd001b2-991e, "test project", published, open, 01-01-2010, 01-01-2015
4ed00772-541e, "test project 2", expired, Close, 01-01-2010, 01-01-2015
WS.ProjectData[] pr = db.GetAllProjectData();
里面的内容如下:
ProjectID,
ProjectTitle
PublishStatus
ProjectStartDate
ProjectEndDate
这些值可以从GetAllProjectData()
数据集也包含projecd,所以如果有一种方法可以关联projecd,那么当它看到相同的projecd时,它会分发ProjectType
我还注意到,如果在parseXML方法中传递ProjectID,则数据集中的第一个ProjectID会进入每行的输出(始终是相同的ProjectID)再次感谢
我不知道你为什么要把DataSet
转换成XML,然后解析XML。可以直接查询和遍历DataSet
。
给定您为DataSet
显示的模式,要获得所有ProjectType
值的逗号分隔列表,执行:
using System.Data; // For System.Data.DataTableExtensions
var ds = db.GetProjectDetails(language);
var projectInfo = string.Join(",", ds.Tables["Table"].AsEnumerable().Select(r => r["ProjectType"].ToString()).ToArray());
给定string projectId
值,可以使用DataTable.Select()
:
ProjectType
string projectId = proj.ProjectID.ToString();
var ds = db.GetProjectDetails(language);
var type = var type = ds.Tables["Table"].Select("ProjectId = '" + projectId + "'").Select(r => r["ProjectType"]).SingleOrDefault();
// Output the type to the file with the rest of the data.
或者,直接使用Linq Where
过滤器:
using System.Data; // For System.Data.DataTableExtensions
string projectId = proj.ProjectID.ToString();
var ds = db.GetProjectDetails(language);
var type = ds.Tables["Table"].AsEnumerable().Where(r => projectId.Equals(r["ProjectId"])).Select(r => r["ProjectType"]).SingleOrDefault();
// Output the type to the file with the rest of the data.
我将使用parseXml
方法,所以:
static List<string> parseXml(DataSet ds)
{
List<string> list = new List<string>();
foreach (DataRow row in ds.Tables[0].Rows)
{
list.Add(row["ProjectType"].ToString());
}
return list;
}
然后我们写如下:
int counter = 0;
foreach(WS.ProjectMetaData proj in pr.Distinct(new ProjectEqualityComparer()))
{
// your code here
var projectInfo = parseXml(ds);
file.WriteLine("{0},{1}, ... ",
proj.ProjectID,
projectInfo[counter],
// ...
);
counter++;
}