【发布时间】:2017-04-27 11:35:11
【问题描述】:
我有一个 Xamarin (C#) 项目,我试图在其中循环一些 XML,但由于某种原因我的代码无法正常工作。
这就是我现在拥有的:
DeviceList = new List<DeviceInfo>();
string ResultStatus = "";
string ResultDevice = "";
var result = Encoding.Default.GetString(e.Result);
result = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + result;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(result);
string xPathStatus = "ed_listdevices";
var nodes = xmlDoc.SelectNodes(xPathStatus);
foreach (XmlNode xNode in nodes) {
ResultStatus = xNode.SelectSingleNode("//status").InnerText;
ResultDevice = xNode.SelectSingleNode("//device").InnerText;
}
if (ResultStatus.ToLower() == "ok") {
XmlDocument deviceDoc = new XmlDocument();
deviceDoc.LoadXml(result);
var deviceNodes = deviceDoc.SelectNodes(xPathStatus + "/device");
//foreach(XmlNode dNode in deviceNodes) {
for (int i = 0; i < deviceNodes.Count; i++) {
DeviceList.Add(new DeviceInfo() {
DeviceID = deviceNodes[i].SelectSingleNode("//id").InnerXml,
DeviceName = deviceNodes[i].SelectSingleNode("//name").InnerXml,
DeviceExtraName = "",
DeviceOnlineStatus = deviceNodes[i].SelectSingleNode("//status").InnerXml,
Location = deviceNodes[i].SelectSingleNode("//address").InnerXml,
Time = deviceNodes[i].SelectSingleNode("//time").InnerXml
});
}
}
当我单步执行代码时,我正确地得到了“ResultStatus”和“ResultDevice”,当我到达
for (int i = 0; i < deviceNodes.Count; i++)
“deviceNodes”变量的计数为 91,我可以看到我想从我正在调用的 web 服务中获取的所有单个 xml 元素。
但是,当我遍历 deviceNodes[i] 时,我只能从第一个 XML 元素中获取值(是的,“i”的值确实发生了变化)。换句话说,我的 DeviceList 中填充了 91 个具有相同值的条目。
我错过了什么明显的东西吗?我做错了什么,因为这不起作用?
PS:我也尝试过使用foreach (XmlNode node in deviceNodes),但结果是一样的。
【问题讨论】:
-
你的 xml 有多大?当文件的大小很小(我们通常使用最大几兆字节)时,将符合您的架构的类放在一起并将 xml 反序列化为 POCO 并使用它们几乎总是更容易。
-
我相信在选择器中使用“//”语法会告诉它从根节点搜索,而不是从本地节点
-
DeviceInfo() 是否声明为 STATIC?
-
@Jason 你明白了 :-) 删除“//”就行了!如果您将其放入答案中,我将接受它作为正确答案。谢谢!