【问题标题】:Reading xml file with multiple child nodes only returns first node读取具有多个子节点的 xml 文件仅返回第一个节点
【发布时间】:2015-05-21 04:59:39
【问题描述】:

我有一个带有命名空间的 xml 文件,我可以正确读取它。它有一个名为“Items”的外部节点,它有多个子节点,其中 50 个。(所以 50 个子节点称为“ReceiverPoints”)。当我检查控制台,它的大小是正确的,即 50,但是当我检查打印输出时,所有输出都是第一个 ReceiverPoint 节点的重复。

我想将每个接收器点保存到数据库中。根据我看到的所有示例,我的实现似乎很好。但它给了我错误的结果。有人可以帮我看看我缺少什么吗?这是xml file

public List<ReceiverPoint> ReadFile()
    {
        receiverList = new List<ReceiverPoint> ();

        Console.WriteLine ("Now in read file method :" + fileLocation);

            xmldoc = new XmlDocument ();
            xmldoc.Load (fileLocation);

        XmlNamespaceManager nameSpaceManager = new XmlNamespaceManager (xmldoc.NameTable);

        //nameSpaceManager.AddNamespace ("ns", "http://schemas.datacontract.org/2004/07/AristotleService.Models");
        nameSpaceManager.AddNamespace ("ns", "http://schemas.datacontract.org/2004/07/GTI.Aristotle.Web.Api.Models");



        XmlElement rootElement = xmldoc.DocumentElement;

        XmlNodeList nodeList = rootElement.SelectNodes("/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint", nameSpaceManager);

        ReceiverPoint receiverPoint = new ReceiverPoint ();
foreach(XmlNode childNode in nodeList)
        {
            receiverPoint.CloseDate = childNode.SelectSingleNode ("/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint/ns:CloseDate", nameSpaceManager).InnerText;
            receiverPoint.CreateDate = childNode.SelectSingleNode ("/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint/ns:CreateDate", nameSpaceManager).InnerText;  
            receiverPoint.CreateWho = childNode.SelectSingleNode ("/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint/ns:CreateWho", nameSpaceManager).InnerText;
            receiverPoint.Easting = childNode.SelectSingleNode ("/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint/ns:Easting", nameSpaceManager).InnerText;
            receiverPoint.Elevation = childNode.SelectSingleNode ("/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint/ns:Elevation", nameSpaceManager).InnerText;
            receiverPoint.IsDeployed = childNode.SelectSingleNode ("/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint/ns:IsDeployed", nameSpaceManager).InnerText; 
            receiverPoint.IsManual = childNode.SelectSingleNode ("/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint/ns:IsManual", nameSpaceManager).InnerText;
            receiverPoint.LastModifyDate = childNode.SelectSingleNode ("/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint/ns:LastModifyDate", nameSpaceManager).InnerText;
            receiverPoint.Latitude = childNode.SelectSingleNode ("/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint/ns:LatitudeWGS84", nameSpaceManager).InnerText;
            receiverPoint.Line = childNode.SelectSingleNode ("/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint/ns:Line", nameSpaceManager).InnerText;
            receiverPoint.Longitude = childNode.SelectSingleNode ("/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint/ns:LongitudeWGS84", nameSpaceManager).InnerText;
            receiverPoint.ReceiverType = childNode.SelectSingleNode ("/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint/ns:ReceiverType", nameSpaceManager).InnerText;
            receiverPoint.Station = childNode.SelectSingleNode ("/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint/ns:Station", nameSpaceManager).InnerText;




            //Get all the values stored in the receiver point object
            string station = receiverPoint.Station;
            string line = receiverPoint.Line;
            string elevation = receiverPoint.Elevation;
            string latitude = receiverPoint.Latitude;
            string longitude = receiverPoint.Longitude;
            string isDeployed = receiverPoint.IsDeployed;
            string easting = receiverPoint.Easting;
            string receiverType = receiverPoint.ReceiverType;
            string closeDate = receiverPoint.CloseDate;
            string createDate = receiverPoint.CreateDate;
            string createWho = receiverPoint.CreateWho;
            string lastModifyDate = receiverPoint.LastModifyDate;


            Console.WriteLine ("String lat : " + latitude);

            Console.WriteLine ("String lon : " + longitude);

            Console.WriteLine ("String create date : " + createDate);

            Console.WriteLine ("String create who : " + createWho);

            //Save the data to the db
            saveDataToDatabase (station,line,elevation,latitude,longitude,isDeployed,easting,receiverType,closeDate,createDate,createWho,lastModifyDate);


        }

        receiverList.Add (receiverPoint);
return receiverList;
    }

【问题讨论】:

    标签: c# xml xamarin xamarin.android


    【解决方案1】:

    这段代码对我有用:

    public List<ReceiverPoint> ReadFile()
            {
                var receiverList = new List<ReceiverPoint>();
    
                Console.WriteLine("Now in read file method :" + "");
    
                var xmldoc = new XmlDocument();
                xmldoc.Load(@"D:\users\..\Downloads\ReceiverPoints.xml");
    
                XmlNamespaceManager nameSpaceManager = new XmlNamespaceManager(xmldoc.NameTable);
    
                //nameSpaceManager.AddNamespace ("ns", "http://schemas.datacontract.org/2004/07/AristotleService.Models");
                nameSpaceManager.AddNamespace("ns", "http://schemas.datacontract.org/2004/07/GTI.Aristotle.Web.Api.Models");
    
    
    
                XmlElement rootElement = xmldoc.DocumentElement;
    
                XmlNodeList nodeList = rootElement.SelectNodes("/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint", nameSpaceManager);
    
    
                foreach (XmlNode childNode in nodeList)
                {
                    ReceiverPoint receiverPoint = new ReceiverPoint();
                    receiverPoint.CloseDate = childNode.SelectSingleNode("ns:CloseDate", nameSpaceManager).InnerText;
                    receiverPoint.CreateDate = childNode.SelectSingleNode("ns:CreateDate", nameSpaceManager).InnerText;
                    receiverPoint.CreateWho = childNode.SelectSingleNode("ns:CreateWho", nameSpaceManager).InnerText;
                    receiverPoint.Easting = childNode.SelectSingleNode("ns:Easting", nameSpaceManager).InnerText;
                    receiverPoint.Elevation = childNode.SelectSingleNode("ns:Elevation", nameSpaceManager).InnerText;
                    receiverPoint.IsDeployed = childNode.SelectSingleNode("ns:IsDeployed", nameSpaceManager).InnerText;
                    receiverPoint.IsManual = childNode.SelectSingleNode("ns:IsManual", nameSpaceManager).InnerText;
                    receiverPoint.LastModifyDate = childNode.SelectSingleNode("ns:LastModifyDate", nameSpaceManager).InnerText;
                    receiverPoint.Latitude = childNode.SelectSingleNode("ns:LatitudeWGS84", nameSpaceManager).InnerText;
                    receiverPoint.Line = childNode.SelectSingleNode("ns:Line", nameSpaceManager).InnerText;
                    receiverPoint.Longitude = childNode.SelectSingleNode("ns:LongitudeWGS84", nameSpaceManager).InnerText;
                    receiverPoint.ReceiverType = childNode.SelectSingleNode("ns:ReceiverType", nameSpaceManager).InnerText;
                    receiverPoint.Station = childNode.SelectSingleNode("ns:Station", nameSpaceManager).InnerText;
    
    
    
    
                    //Get all the values stored in the receiver point object
                    string station = receiverPoint.Station;
                    string line = receiverPoint.Line;
                    string elevation = receiverPoint.Elevation;
                    string latitude = receiverPoint.Latitude;
                    string longitude = receiverPoint.Longitude;
                    string isDeployed = receiverPoint.IsDeployed;
                    string easting = receiverPoint.Easting;
                    string receiverType = receiverPoint.ReceiverType;
                    string closeDate = receiverPoint.CloseDate;
                    string createDate = receiverPoint.CreateDate;
                    string createWho = receiverPoint.CreateWho;
                    string lastModifyDate = receiverPoint.LastModifyDate;
    
    
                    Console.WriteLine("String lat : " + latitude);
    
                    Console.WriteLine("String lon : " + longitude);
    
                    Console.WriteLine("String create date : " + createDate);
    
                    Console.WriteLine("String create who : " + createWho);
    
                    //Save the data to the db
                    //saveDataToDatabase(station, line, elevation, latitude, longitude, isDeployed, easting, receiverType, closeDate, createDate, createWho, lastModifyDate);
    
                    receiverList.Add(receiverPoint);
                }
    
    
                return receiverList;
            }
    

    【讨论】:

    • 即使进行了这些更改,它仍然只显示来自第一个接收点的数据 50 次。
    • 哦,是的,我可以看到您的第二个错误:当您在 childNode 上使用 selectSingleNode 时,您已经在 "/ns:PagedDataInquiryResponseOfReceiverPointQ3ffICf5/ns:Items/ns:ReceiverPoint" 中,所以只需输入相对路径(例如 ns:CloseDate 为第一)
    • 我听从了你的建议,对子节点的相对路径进行了编辑。但结果还是一样。只得到第一个子节点
    • 是的,这确实有效!非常感谢。我可以在控制台中看到所有节点都已被读取。在列表视图中,我只从 sqlite db 中读取了一行,但是这是一个不同的问题。您的解决方案有效。感谢您的帮助:)
    【解决方案2】:

    在 foreach 循环内移动 receiverList.Add(receiverPoint)。

    【讨论】:

    • 我在 foreach 循环中移动了该行,但我得到了同样的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多