将xml webresponse转换为dataTable

时间:2019-01-11 02:01:14

标签: c# httpwebresponse

我正在尝试制作一个从另一个域返回响应列表的Web服务,但是我在将WebResponse转换为DataTable时遇到了麻烦,因此我可以将其作为列表返回。因此,基本上到目前为止,流程是WebResponse -> DataTable -> List

public string getAgentStat()
    {

        WebRequest request = WebRequest.Create("http://1.1.1.1/test/testweb.dll?Tenant=test&Filter=Calls");
        request.Credentials = new NetworkCredential("test@test.com", "P@ssw0rd123");
        request.Method = "GET";
        WebResponse response = request.GetResponse();
        DataTable table = new DataTable();


        System.IO.StreamReader stream = new System.IO.StreamReader(response.GetResponseStream());
        table.ReadXml(stream);

        return stream.ReadToEnd();
    }

但是我在代码行table.ReadXml(stream)上遇到错误,错误提示

  

DataTable不支持从Xml进行模式推断

我想尽可能快地执行此操作,因此必须避免在将Web响应转换为Datatable时出现循环。

任何建议都被接受。如果您认为我的方法效率低下。

编辑1:将返回的列表

public class test
{
  public int cw;
}

static List<test> test_ = new List<test> {};

编辑2:返回的XML

<QCalls ts="Fri Jan 11 01:30:27 2019 UTC" cts="Fri Jan 11 01:27:03 2019 UTC" tzo="-28800" al="false">
<Q id="1" n="testLo" wt="151516" ch="29" cwt="1635" ct="25" co="29" ca="0" cw="4" awt="56904" act="282" cbh="3" ofi="0" ofo="0" catqos="0" dlro="275">
<internet id="1" n="RetailerLo"/>
<message id="1" n="RetailerLo"/>
<phone id="1" n="RetailerLo" wt="0" ch="22" cwt="23" ct="22" co="22" ca="0" cw="0" awt="0" act="372" cbh="3" ofi="0" ofo="0" catqos="0"/>
<callback id="1" n="RetailerLo" wt="151516" ch="7" cwt="1612" ct="3" co="7" cw="4" awt="56904" act="0" cbh="0"/>
<O id="0" cnt="1"/>
</Q>
<Q id="1" n="testHi" wt="36326" ch="9" cwt="41790" ct="7" co="7" ca="0" cw="1" awt="36326" act="770" cbh="2" ofo="0" catqos="0" dlro="26">
<internet id="1" n="RetailerHi"/>
<message id="1" n="RetailerHi"/>
<phone id="1" n="RetailerHi" wt="0" ch="8" cwt="7" ct="7" co="7" ca="0" cw="0" awt="0" act="866" cbh="2" ofo="0" catqos="0"/>
<callback id="1" n="RetailerHi" wt="36326" ch="1" cwt="41783" ct="0" co="0" cw="1" awt="36326" act="1" cbh="0"/>
<O id="0" cnt="26"/>
</Q>
</QCalls>

1 个答案:

答案 0 :(得分:2)

您可以使用XmlSerializer来实现:

[XmlRoot("QCalls")]
public class QCalls
{
    [XmlElement("Q")]
    public List<QItem> Items { get; set; }
}

public class QItem
{
    [XmlAttribute("cw")]
    public int CW { get; set; }
}

// Deserialization code
QCalls calls = null;
var serializer = new XmlSerializer(typeof(QCalls));
calls = (QCalls)serializer.Deserialize(response.GetResponseStream());
return calls.Items;

Try it online

请注意,var serializer =行上可能会出现异常。这是内部问题,由XmlSerializer内部处理。有关更多信息,请参见问题here