我正在尝试制作一个从另一个域返回响应列表的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>
答案 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;
请注意,var serializer =
行上可能会出现异常。这是内部问题,由XmlSerializer
内部处理。有关更多信息,请参见问题here。