【发布时间】:2015-12-14 18:32:12
【问题描述】:
我正在构建一个调用 3 个不同 Web 服务的控制台应用程序。第一个调用所有项目及其项目 ID、项目状态和项目名称。
第一个 Web 服务获取所有项目 ID GetProjectData() 并且调用正确。我将结果放入 csv 文件中。
第二个电话,GetProjectDetails(),它为我提供了所有项目的dataset(数据集中有许多值)。
此调用包含我需要将它放在 GetProjectData() 调用旁边的 projectType(打开或关闭)。
这是来自 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 做一些事情并用 projectIDs 引用它,这样它就可以知道它的类型是打开还是关闭。
谢谢
预期输出:
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) 再次感谢
【问题讨论】:
-
为什么输出
userIDs.Length.ToString(NumberFormatInfo.InvariantInfo)?这不是您要放置Type的地方吗? -
另外,你为什么在循环内调用
var projectInfo = parseXML(db.GetProjectDetails(language));?你只是传递一个常量空字符串。 -
@dbc 我需要用户 ID 和类型。 userId 来自 GetList() 网络服务,类型来自 GetProjectDetails() 网络服务,这就是我需要两个结果的原因
-
@dbc GetPtojectDetails() 需要一个字符串作为参数,当我使用 SOAPUI 时,该字符串可以为空。我放入循环中是因为我需要具有相同关系(projectID)的所有输出,谢谢
-
但是您没有将
projectID传递给db.GetProjectDetails(language),而是传递了一个空字符串。
标签: c# xml dataset console-application streamwriter