将 xml webresponse 转换为 dataTable

Convert xml webresponse to dataTable

我正在尝试创建一个 Web 服务,该服务 return 是来自另一个域的响应列表,但我无法将 WebResponse 转换为 DataTable,因此我可以 return 它作为列表。所以基本上流程是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 does not support schema inference from Xml

尽可能快地完成它,因此必须避免在将 webresponse 转换为 Datatable 时循环。

接受任何建议。如果你觉得我的方法效率低下。

编辑 1:将 returned

的列表
public class test
{
  public int cw;
}

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

编辑 2:XML returned

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

您可以使用 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.