使用XML:当C#

时间:2017-06-22 13:17:37

标签: c# xml

我遇到以下代码的问题:

    private static DataTable GetSchedule(string ServerUrl, string LocalAPIKey)
    {

        string result = "";

        // Create the web request
        HttpWebRequest request = WebRequest.Create(new Uri(ServerUrl)) as HttpWebRequest;

        request.Method = @"POST";
        request.UserAgent = "NuSOAP/0.9.5 (1.123)";
        request.ContentType = "text/xml; charset=UTF-8";
        request.Headers.Add("SOAPAction", "uri:xx/GetSchedule");

        string xmlPayload = @"<?xml version=""1.0"" encoding=""UTF-8""?>
                            <soapenv:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
                            xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/""
                            xmlns:uri=""uri:xx"">
                            <soapenv:Header/>
                            <soapenv:Body>
                            <uri:wsdlGetSchedule soapenv:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/"">
                            <apiKey xsi:type = ""xsd:string"">"+LocalAPIKey+@"</apiKey>
                            <GetSchedule xsi:type= ""flex:GetSchedule"" xmlns:flex= ""https://server/soap/xx"">
                            <fromDate xsi:type=""xsd:string"">2017-03-31</fromDate>
                            <toDate xsi:type=""xsd:string"">2017-03-31</toDate>
                            </GetSchedule>
                            </uri:wsdlGetSchedule>
                            </soapenv:Body>
                            </soapenv:Envelope>
        ";

        // Create the data we want to send
        StringBuilder data = new StringBuilder();
        data.Append(xmlPayload);
        // Create a byte array of the data we want to send
        byte[] byteData = Encoding.UTF8.GetBytes(data.ToString());
        request.ContentLength = byteData.Length;
        // Set the content length in the request headers
        Console.WriteLine(request.ContentLength.ToString());

        // Write data to request
        using (Stream postStream = request.GetRequestStream())
        {
            postStream.Write(byteData, 0, byteData.Length);
        }

        // Get response and return it
        XmlDocument xmlResult = new XmlDocument();
        try
        {
            using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
            {
                StreamReader reader = new StreamReader(response.GetResponseStream());
                result = reader.ReadToEnd();
                System.Diagnostics.Debug.WriteLine(result);
                reader.Close();
            }
            xmlResult.LoadXml(result);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }

        DataTable dt = new DataTable("Schedule");
        dt.Columns.Add("Date");
        dt.Columns.Add("StartTime");
        dt.Columns.Add("EndTime");
        dt.Columns.Add("Scheduled_Hours");
        dt.Columns.Add("StoreKey");
        XmlNodeList also_calledList = xmlResult.GetElementsByTagName("return");
        XmlNode also_calledElement = also_calledList[0];
        XmlNodeList titleList = also_calledElement.ChildNodes;

        foreach (XmlNode titleNode in titleList)
        {

            if (titleNode["badgeNo"] != null)
            {
                System.Diagnostics.Debug.WriteLine("Inside foreach loop");
                DataRow row = dt.NewRow();
                row["Date"] = titleNode["begDate"].InnerText;
                row["StartTime"] = titleNode["begTime"].InnerText;
                row["EndTime"] = titleNode["endTime"].InnerText;
                row["Scheduled_Hours"] = titleNode["hours"].InnerText;
                row["StoreKey"] = titleNode["costCentre"].InnerText;
                System.Diagnostics.Debug.WriteLine(titleNode["begDate"].InnerText + " " + titleNode["begTime"].InnerText + " " + titleNode["endTime"].InnerText + " " + titleNode["hours"].InnerText);
                dt.Rows.Add(row);
           }
            else
                System.Diagnostics.Debug.WriteLine("badgeNo not found");
        }
        return dt;
    }

但是当我使用titleList检查Quick Watch -> Results View -> [0] -> First Child -> InnerXml时,我得到以下输出:

<item xsi:type="tns:Schedule" xmlns:xsi="http://www.w3.org/2001/XMLSchema-    instance">
<begDate xsi:type="xsd:date">2017-03-31</begDate>
<begTime xsi:type="xsd:time">16:00:00</begTime>
<endDate xsi:type="xsd:date">2017-03-31</endDate>
<endTime xsi:type="xsd:time">20:15:00</endTime>
<persId xsi:type="xsd:int">316</persId>
<badgeNo xsi:type="xsd:string">3334</badgeNo>
<section xsi:type="xsd:int">1</section>
<sectionName xsi:type="xsd:string">
</sectionName>
<hours xsi:type="xsd:decimal">4.25</hours>
<costCentre xsi:type="xsd:int">5697</costCentre>
</item>

当我检查dt时,它只显示标题,但没有实际数据(只有&#34; NULL&#34;)

这怎么可能? InnerXml显示例如badgeNo的记录,这是输入If statement的约束。仍然,if循环"In the foreach loop"内的文本永远不会被执行。

为什么程序没有进入if循环?

  

修改

这是文件xmlResult。请注意,删除了一些属性,因为返回了50列:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:tns="https://SERVERURL">
<SOAP-ENV:Body>
<ns1:wsdlGetSchedulesV2Response xmlns:ns1="uri:FlexForce">
<return xsi:type="tns:SchedulesV2Response">
<schedules xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:ScheduleV2[4]">
<item xsi:type="tns:ScheduleV2">
<restId xsi:type="xsd:int">1124</restId>
<begDate xsi:type="xsd:date">2017-03-31</begDate>
<begTime xsi:type="xsd:time">16:00:00</begTime>
<endDate xsi:type="xsd:date">2017-03-31</endDate>
<endTime xsi:type="xsd:time">20:15:00</endTime>
<breakType xsi:type="xsd:int">0</breakType>
<begBreak xsi:type="xsd:time">00:00:00</begBreak>
<endBreak xsi:type="xsd:time">00:00:00</endBreak>
<begBreak2 xsi:type="xsd:time">00:00:00</begBreak2>
<endBreak2 xsi:type="xsd:time">00:00:00</endBreak2>
<begBreak3 xsi:type="xsd:time">00:00:00</begBreak3>
<endBreak3 xsi:type="xsd:time">00:00:00</endBreak3>
<begBreak4 xsi:type="xsd:time">00:00:00</begBreak4>
<endBreak4 xsi:type="xsd:time">00:00:00</endBreak4>
<persId xsi:type="xsd:int">345516</persId>
<badgeNo xsi:type="xsd:string">3334</badgeNo>
<status xsi:type="xsd:int">1</status>
<grabbAble xsi:type="xsd:int">0</grabbAble>
<grabbId xsi:type="xsd:int">0</grabbId>
<approved xsi:type="xsd:int">0</approved>
<managerId xsi:type="xsd:int">490150</managerId>
<categoryId xsi:type="xsd:int">4845</categoryId>
<categoryName xsi:type="xsd:string">Öppet skift</categoryName>
<comment xsi:type="xsd:string">
</comment>
<section xsi:type="xsd:int">1</section>
<sectionName xsi:type="xsd:string">
</sectionName>
<hours xsi:type="xsd:decimal">4.25</hours>
<fixSchedId xsi:type="xsd:int">0</fixSchedId>
<shiftChanged xsi:type="xsd:int">0</shiftChanged>
<costCentre xsi:type="xsd:int">5697</costCentre>
</item>
</schedules>
<validationErrors xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:string[0]">
</validationErrors>
</return>
</ns1:wsdlGetSchedulesV2Response>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope
  

编辑2

我已编辑了

XmlNodeList also_calledList = XmlResult.GetElementByTagName("return");

XmlNodeList also_calledList = XmlResult.GetElementByTagName("item");

这仍然会产生错误,badgeNo在循环内的NullException语句中获得if

对于每个属性,XmlNodeResults View下的[0][50]范围内具有以下外观。在地址编号15处,我可以使用以下badgeNo找到OuterXml

<badgeNo xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">3334</badgeNo>

所以它确实有价值。

如果我要return而不是item来生成titleNode(就像在原始解决方案中一样),我会在titleNode上获得以下InnerXml:

<schedules xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:ScheduleV2[4]" 
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<item xsi:type="tns:ScheduleV2">
<restId xsi:type="xsd:int">1124</restId>
<begDate xsi:type="xsd:date">2017-03-31</begDate>
<begTime xsi:type="xsd:time">16:00:00</begTime>
<endDate xsi:type="xsd:date">2017-03-31</endDate>
<endTime xsi:type="xsd:time">20:15:00</endTime>
<breakType xsi:type="xsd:int">0</breakType>
<begBreak xsi:type="xsd:time">00:00:00</begBreak>
<endBreak xsi:type="xsd:time">00:00:00</endBreak>
<begBreak2 xsi:type="xsd:time">00:00:00</begBreak2>
<endBreak2 xsi:type="xsd:time">00:00:00</endBreak2>
<begBreak3 xsi:type="xsd:time">00:00:00</begBreak3>
<endBreak3 xsi:type="xsd:time">00:00:00</endBreak3>
<begBreak4 xsi:type="xsd:time">00:00:00</begBreak4>
<endBreak4 xsi:type="xsd:time">00:00:00</endBreak4>
<persId xsi:type="xsd:int">345516</persId>
<badgeNo xsi:type="xsd:string">3334</badgeNo>
<status xsi:type="xsd:int">1</status>
<grabbAble xsi:type="xsd:int">0</grabbAble>
<grabbId xsi:type="xsd:int">0</grabbId>
<approved xsi:type="xsd:int">0</approved>
<managerId xsi:type="xsd:int">490150</managerId>
<categoryId xsi:type="xsd:int">4845</categoryId>
<categoryName xsi:type="xsd:string">Öppet skift</categoryName>
<comment xsi:type="xsd:string">
</comment>
<section xsi:type="xsd:int">1</section>
<sectionName xsi:type="xsd:string">
</sectionName>
<hours xsi:type="xsd:decimal">4.25</hours>
<fixSchedId xsi:type="xsd:int">0</fixSchedId>
<shiftChanged xsi:type="xsd:int">0</shiftChanged>
<costCentre xsi:type="xsd:int">5697</costCentre>
</item>
</schedules>

此外,titleNode还有2个元素,[0]对应于item块中找到的每个属性,[1]对应validationErrors

0 个答案:

没有答案