将 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.
我正在构建一个调用 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.