使用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)再次感谢

使用XmlNodeList与多个web服务调用

我不知道你为什么要把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++;
}