Avatar billede jackass- Nybegynder
18. maj 2015 - 08:20 Der er 3 kommentarer og
1 løsning

Parse XML og brug som datasource i datagridview

Hej,

Jeg har lidt problemer med at parse XML korrekt og håber nogen her er lidt skarpere til den slags og kan hjælpe mig videre :-) Eksempel på XML'en for formatets skyld:

<?xml version="1.0" encoding="UTF-8" ?>
<Hosts>
    <Host>
        <Name>
            <![CDATA[Gateway 01]]>
        </Name>
        <IP>
            <![CDATA[149.212.48.1]]>
        </IP>
        <Services>
            <Service>
                <ServiceName>
                    <![CDATA[HTTP]]>
                </ServiceName>
                <Port>
                    <![CDATA[80]]>
                </Port>
            </Service>
            <Service>
                <ServiceName>
                    <![CDATA[HTTPS]]>
                </ServiceName>
                <Port>
                    <![CDATA[443]]>
                </Port>
            </Service>
        </Services>
    </Host>
    <Host>
        <Name>
            <![CDATA[localhost]]>
        </Name>
        <IP>
            <![CDATA[127.0.0.1]]>
        </IP>
        <Services>
            <Service>
                <ServiceName>
                    <![CDATA[HTTP]]>
                </ServiceName>
                <Port>
                    <![CDATA[80]]>
                </Port>
            </Service>
            <Service>
                <ServiceName>
                    <![CDATA[RDP]]>
                </ServiceName>
                <Port>
                    <![CDATA[3389]]>
                </Port>
            </Service>
        </Services>
    </Host>
</Hosts>


Koden til at parse:

XmlDocument doc = new XmlDocument();
doc.Load(filename);

List<Target> targets = new List<Target>();

XmlNodeList Hosts = doc.GetElementsByTagName("Host");
foreach (XmlNode Host in Hosts)
{
    string navn = Host.ChildNodes[0].FirstChild.Value;
    string ip = Host.ChildNodes[1].FirstChild.Value;

    XmlNodeList Services = doc.GetElementsByTagName("Service");

    foreach (XmlNode Service in Services)
    {
        string servicename = Service.ChildNodes[0].FirstChild.Value;
        string port = Service.ChildNodes[1].FirstChild.Value;
        targets.Add(new Target(navn, ip, servicename, Convert.ToInt32(port), ""));
    }

}
dgViewTCP.DataSource = targets;


Men resultatet:

Gateway 01    149.212.48.1    HTTP    80
Gateway 01    149.212.48.1    HTTPS    443
Gateway 01    149.212.48.1    HTTP    80
Gateway 01    149.212.48.1    RDP    3389
localhost    127.0.0.1    HTTP    80
localhost    127.0.0.1    HTTPS    443
localhost    127.0.0.1    HTTP    80
localhost    127.0.0.1    RDP    3389


Så "doc.GetElementsByTagName("Service");" bliver altså ikke begrænset pr Host og output bliver så samtlige services for samtlige hosts i stedet - og jeg har lidt bøvl med at hitte ud af hvordan jeg får løkken begrænset til services pr host.

Jeg har også forsøgt mig ud i dette, men det går ikke meget bedre :-/

foreach (XmlNode Host in Hosts)
{
    string navn = Host.ChildNodes[0].FirstChild.Value;
    string ip = Host.ChildNodes[1].FirstChild.Value;

    foreach (XmlNode Service in Host.ChildNodes)
    {
        string servicename = Service.SelectSingleNode("ServiceName").InnerText;
        string port = Service.SelectSingleNode("Port").InnerText;
        targets.Add(new Target(navn, ip, servicename, Convert.ToInt32(port), ""));
    }


På forhånd mange tak.
Avatar billede Spotgun Seniormester
18. maj 2015 - 18:46 #1
Prøv at se om det her kan bruges:

            XmlDocument doc = new XmlDocument();
            doc.Load(filename);

            List<Target> targets = new List<Target>();

            XmlNodeList hosts = doc.SelectNodes("//Host");

            foreach (XmlNode host in hosts)
            {
                string name = host.SelectSingleNode(".//Name").InnerText;
                string ip = host.SelectSingleNode(".//IP").InnerText;
                XmlNodeList services = host.SelectNodes(".//Service");
                foreach(XmlNode service in services)
                {
                    string serviceName = service.SelectSingleNode(".//ServiceName").InnerText;
                    string port = service.SelectSingleNode(".//Port").InnerText;
                    targets.Add(new Target(name, ip, serviceName, Convert.ToInt32(port), ""));
                }

            }
            dgViewTCP.DataSource = targets;
Avatar billede Spotgun Seniormester
18. maj 2015 - 18:56 #2
Tag evt. et kig på XPath syntaksen her: http://www.w3schools.com/xpath/xpath_syntax.asp
Avatar billede jackass- Nybegynder
19. maj 2015 - 07:14 #3
Og det spiller max! Kanon, mange tak for det + URL :-)

Smider du et svar?
Avatar billede Spotgun Seniormester
19. maj 2015 - 08:49 #4
Værsgo.
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

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