Avatar billede nidyahou Praktikant
04. august 2009 - 01:10 Der er 3 kommentarer og
1 løsning

problem med at få xmlDoc.ImportNode til at importere node

Det er som om at følgende kode bare ikke gør noget. Når jeg får min xpathnodeiterator tilbage er der ingen noder, så jeg tror ikke de bliver importeret rigtigt (jeg har fjernet noget af koden, fordi den ikke er relevant. Hele koden er nederst)

        public static XPathNodeIterator GeneratePlaylist(XPathNodeIterator PlaylistNodes, string StartDatestring, string EndDatestring)
        {
            XmlDocument xmlDoc = new XmlDocument();
            while (PlaylistNodes.MoveNext())
            {
                XPathNavigator node = PlaylistNodes.Current.CreateNavigator();                            xmlDoc.ImportNode(((IHasXmlNode)node).GetNode(), true);
            }

            return xmlDoc.CreateNavigator().Select(".");
        }


Det skøre er ydermere at jeg sagtens kan få outputtet outerxml'en for de noder jeg gerne ville have importeret med følgende hjælpemetode jeg har lavet for at teste om jeg er debil (igen kan hele koden ses nederst):


        public static string GetPlaylistXmlAsString(XPathNodeIterator Nodes, string StartDatestring, string EndDatestring)
        {
            while(Nodes.MoveNext())
            {
                XPathNavigator node = Nodes.Current.CreateNavigator();
               
                str += node.GetAttribute("id", "");
                    str += ((IHasXmlNode)node).GetNode().OuterXml;
               
            }
            return str;
        }



------------------------------
Hele koden
------------------------------
public static XPathNodeIterator GeneratePlaylist(XPathNodeIterator PlaylistNodes, string StartDatestring, string EndDatestring)
        {

            XmlDocument xmlDoc = new XmlDocument();
            DateTime StartDate = DateTime.Parse(StartDatestring);
            DateTime EndDate = DateTime.Parse(EndDatestring);
            DateTime playlistDate = StartDate;
            while (PlaylistNodes.MoveNext())
            {
                XPathNavigator node = PlaylistNodes.Current.CreateNavigator();
                DateTime startdate = DateTime.Parse(node.SelectSingleNode("data[@alias='StartDate']").Value);
                DateTime enddate = DateTime.Parse(node.SelectSingleNode("data[@alias='EndDate']").Value);
               
                //check startdate is before playlistdate, enddate is after playlistdate playlistdate is before playlistend, StartTime is before playlistDate time, EndTime is after playlistDate time
                if (startdate <= playlistDate && enddate > playlistDate && playlistDate < EndDate && Convert.ToDateTime(node.SelectSingleNode("data[@alias='StartTime']").Value) < Convert.ToDateTime(playlistDate.ToShortTimeString()) && Convert.ToDateTime(node.SelectSingleNode("data[@alias='EndTime']").Value) > Convert.ToDateTime(playlistDate.ToShortTimeString()))
                {
                    xmlDoc.ImportNode(((IHasXmlNode)node).GetNode(), true);
                    playlistDate.AddMilliseconds(int.Parse(node.SelectSingleNode("data[@alias='Duration']").Value));
                }
            }

            return xmlDoc.CreateNavigator().Select(".");
        }

-------------
part 2


public static string GetPlaylistXmlAsString(XPathNodeIterator Nodes, string StartDatestring, string EndDatestring)
        {
            DateTime StartDate = DateTime.Parse(StartDatestring);
            DateTime EndDate = DateTime.Parse(EndDatestring);
            DateTime playlistDate = StartDate;
            string str = "Startdate = " + StartDate.ToLongTimeString() + " And Enddate = " + EndDate.ToLongTimeString();
            while(Nodes.MoveNext())
            {
                XPathNavigator node = Nodes.Current.CreateNavigator();
                DateTime startdate = DateTime.Parse(node.SelectSingleNode("data[@alias='StartDate']").Value);
                DateTime enddate = DateTime.Parse(node.SelectSingleNode("data[@alias='EndDate']").Value);
                str += "( " + Convert.ToDateTime(node.SelectSingleNode("data[@alias='StartTime']").Value).ToShortTimeString() + " - " + Convert.ToDateTime(node.SelectSingleNode("data[@alias='EndTime']").Value).ToShortTimeString() + " )";
                //check startdate is before playlistdate, enddate is after playlistdate playlistdate is before playlistend, StartTime is before playlistDate time, EndTime is after playlistDate time
                if(startdate <= playlistDate && enddate > playlistDate && playlistDate < EndDate && Convert.ToDateTime(node.SelectSingleNode("data[@alias='StartTime']").Value) < Convert.ToDateTime(playlistDate.ToShortTimeString()) && Convert.ToDateTime(node.SelectSingleNode("data[@alias='EndTime']").Value) > Convert.ToDateTime(playlistDate.ToShortTimeString()))
                {
                str += node.GetAttribute("id", "");
                    str += ((IHasXmlNode)node).GetNode().OuterXml;
                    playlistDate.AddMilliseconds(int.Parse(node.SelectSingleNode("data[@alias='Duration']").Value));
                }
               
            }
            return str;
        }
Avatar billede arne_v Ekspert
04. august 2009 - 04:59 #1
xmlDoc.ImportNode importerer ikke noden ind i xmlDoc.

xmlDoc.ImportNode returnerer en node som kan appendes ind i xmlDoc.

Demo:

using System;
using System.Xml;
using System.Xml.XPath;

namespace E
{
    public class Program
    {
        public static XPathNodeIterator M1(XPathNodeIterator it)
        {
            XmlDocument doc = new XmlDocument();
            doc.AppendChild(doc.CreateElement("newall"));
            while(it.MoveNext())
            {
                doc.DocumentElement.AppendChild(doc.ImportNode((XmlNode)it.Current.UnderlyingObject, true));
            }
            return doc.CreateNavigator().Select(".");
        }
        public static void M2(XPathNodeIterator it)
        {
            while(it.MoveNext())
            {
                Console.WriteLine(it.Current.OuterXml);
            }
        }
        public static void Main(string[] args)
        {
            string xml = "<all><one>A</one><one>BB</one><one>CCC</one></all>";
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            XPathNodeIterator res = M1(doc.CreateNavigator().Select("//all/one"));
            M2(res);
            Console.ReadKey(true);
        }
    }
}
Avatar billede nidyahou Praktikant
04. august 2009 - 13:07 #2
per-fekt.

drop et svar :)
Avatar billede nidyahou Praktikant
04. august 2009 - 13:08 #3
hov. det var vist en tanketorsk. det var dig og ikke mig der skulle droppe et svar :)
Avatar billede arne_v Ekspert
04. august 2009 - 19:56 #4
svar fra mig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester