我有以下代码,当服务只返回一个项目时效果很好......但在大多数情况下,它会返回很多项目。我似乎无法弄清楚如何在项目上做一个简单的foreach。
DataReference.USZipSoapClient blah = new DataReference.USZipSoapClient("USZipSoap");
var results = blah.GetInfoByCity(tbCityName.Text).InnerXml;
//Response.Write(results);
XmlDocument docArticle = new XmlDocument();
docArticle.LoadXml(results);
StringBuilder builder = new StringBuilder();
XmlNodeList nodeCity = docArticle.ChildNodes[0].SelectNodes("CITY");
XmlNodeList nodeState = docArticle.ChildNodes[0].SelectNodes("STATE");
XmlNodeList nodeZip = docArticle.ChildNodes[0].SelectNodes("ZIP");
XmlNodeList nodeAreaCode = docArticle.ChildNodes[0].SelectNodes("AREA_CODE");
XmlNodeList nodeTimeZone = docArticle.ChildNodes[0].SelectNodes("TIME_ZONE");
builder.Append(nodeCity[0].InnerText + "<br/>");
builder.Append(nodeState[0].InnerText + "<br/>");
builder.Append(nodeZip[0].InnerText + "<br/>");
builder.Append(nodeAreaCode[0].InnerText + "<br/>");
builder.Append(nodeTimeZone[0].InnerText + "<br/>");
lblCityName.Text = builder.ToString();
为一个itme返回的数据如下所示。正如我所提到的,然而大多数结果带回了许多项目而不仅仅是一项。
<NewDataSet xmlns=""><Table><CITY>Marana</CITY><STATE>AZ</STATE><ZIP>85653</ZIP><AREA_CODE>520</AREA_CODE><TIME_ZONE>M</TIME_ZONE></Table></NewDataSet>
感谢任何帮助!
答案 0 :(得分:1)
使用XDocument
类附带的 Linq To XML ,使用该类比XmlDocument
更容易。
在使用该类之前,您必须引用System.Xml.Linq
并导入具有相同名称的命名空间。
使用XDocument
,您可以编写以下代码:
var docArticle = XDocument.Parse(results);
var results = docArticle.Element("NewDataSet").Elements().Select(elt => new
{
City = elt.Element("CITY") != null ? elt.Element("CITY").Value : string.Empty,
State = elt.Element("STATE") != null ? elt.Element("STATE").Value : string.Empty,
Zip = elt.Element("ZIP") != null ? elt.Element("ZIP").Value : string.Empty,
AreaCode = elt.Element("AREA_CODE") != null ? elt.Element("AREA_CODE").Value : string.Empty,
TimeZone = elt.Element("TIME_ZONE") != null ? elt.Element("TIME_ZONE").Value : string.Empty,
}).ToList();
// Here do what you want with the results variable