【问题标题】:C# (Xamarin): looping through XMLC# (Xamarin):循环通过 XML
【发布时间】: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 &lt; 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 你明白了 :-) 删除“//”就行了!如果您将其放入答案中,我将接受它作为正确答案。谢谢!

标签: c# xml xamarin


【解决方案1】:
选择器中的

"//" 告诉它从文档的根节点开始搜索。如果要在“当前”节点下进行本地搜索,去掉“//”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    相关资源
    最近更新 更多