将 XmlNodeList 与多个 Web 服务调用一起使用

Using XmlNodeList with several web services call

我正在构建一个调用 3 个不同 Web 服务的控制台应用程序。第一个调用所有项目及其项目 ID、项目状态和项目名称。

第一个 Web 服务获取所有项目 ID GetProjectData() 并且调用正确。我正在将结果放入 csv 文件中。

第二次调用,GetProjectDetails(),它为我提供了所有项目的 dataset(数据集中有很多值)。

此调用包含项目类型(打开或关闭),我需要将其放在 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 做一些事情并用 projectID 引用它,这样它才能知道它的类型是打开还是关闭。

谢谢

预期输出:

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()

导出的值

数据集还包含 ProjectID,因此如果有关联 projectId 的方法,那么当它看到相同的 projectID 时,它会分配 ProjectType

我还注意到,如果我从 parseXML 方法内部传递 ProjectID,则数据集中的第一个 ProjectID 会进入每一行的输出(始终相同的 ProjectID) 再次感谢

我会这样做 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++;
}

我不确定您为什么要将 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 值,要找到它对应的 ProjectType,您可以使用 DataTable.Select():

    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.