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.