将 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;
请注意,您可能会在 var serializer =
行遇到异常。这是内部事务,由 XmlSerializer
内部处理。有关详细信息,请参阅问题 here.
我正在尝试创建一个 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;
请注意,您可能会在 var serializer =
行遇到异常。这是内部事务,由 XmlSerializer
内部处理。有关详细信息,请参阅问题 here.