Avatar billede lasserasch Juniormester
18. februar 2009 - 14:50 Der er 10 kommentarer og
1 løsning

Hjælp til at Gennemløbe XML.

Hejsa.

Jeg har nu bøvlet med det her i vildt lang tid, og jeg forstår simpelthen ikke hvordan det skal gøres. Så nu håber jeg der er en XML haj som kan hjælpe.

Jeg har nedenstående XML. Det er i virkeligheden meget størrere, med mange flere <document> sektioner, men er cuttet ned for overskueligheden skyld. Det er noget XML som bliver retuneret af en søge maskine i mit CMS system.

Jeg ville gerne tælle sammen i .NET hvor mange dokumenter (søgeresultater) der er i de forskellige kategorier (scSection).

Men jeg kan simpelthen ikke finde ud af at løbe resultaterne igennem. Så det jeg har brug for et et lille eksempel på hvordan jeg henter værdien af den property der hedder "ScSection" ud i en string.

Nogen der kan hjæpe?


Mvh.
Lasse



<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<Search id="{87ab58a7-310e-456b-912c-33401b4197ee}">
<SearchResult offset="0" num-results="10" total-num-results="142" search-time="14.9625" sort-time="0.3783" result-xml-build-time="5.189" dictionary-time="0.919" total-time="20.229" group-mode="enabled" next-page-href="/Sitesoegning.aspx?group=_disabled&amp;id=&amp;page=2">

<GroupInfo>
<Group property="scSection" value="Andet" count="10" size="26" header="" header-href="xxx.aspx?group=_disabled&amp;id=&amp;sections=Andet">

<Document name="{AD06AE28-0C7B-41F2-BF14-CC49CC7DE38C}" docid="845" created="16-10-2008 09:33:01" updated="16-10-2008 09:33:01" created-iso="2008-10-16T09:33:01" updated-iso="2008-10-16T09:33:01" parent-path="/" index="xx.xxx" language="1030" weight="0.8800" weight-permille="879" position="1">

<Property name="scID">{AD06AE28-0C7B-41F2-BF14-CC49CC7DE38C}</Property>
<Property name="scName">Navn</Property>
<Property name="scPath">/sti</Property>
<Property name="scUri">/sti/filnavn.aspx</Property>
<Property name="scUpdated" value="23-07-2007 23:40:33" value-iso="2007-07-23T23:40:33" />
<Property name="scUpdatedBy">domain\xx</Property>
<Property name="scSection">Andet</Property>
<Property name="Title">Titel</Property>
<Property name="Author"></Property>

<Markup name="Text">Dette er en test</Markup>

</Document>

<Document name="{AD06AE28-0C7B-41F2-BF14-CC49CC7DE38C}" docid="845" created="16-10-2008 09:33:01" updated="16-10-2008 09:33:01" created-iso="2008-10-16T09:33:01" updated-iso="2008-10-16T09:33:01" parent-path="/" index="xx.xxx" language="1030" weight="0.8800" weight-permille="879" position="1">

<Property name="scID">{AD06AE28-0C7B-41F2-BF14-CC49CC7DE38C}</Property>
<Property name="scName">Navn 2</Property>
<Property name="scPath">/sti 2</Property>
<Property name="scUri">/sti/filnavn2.aspx</Property>
<Property name="scUpdated" value="23-07-2007 23:40:33" value-iso="2007-07-23T23:40:33" />
<Property name="scUpdatedBy">domain\xx2</Property>
<Property name="scSection">Andet</Property>
<Property name="Title">Titel2</Property>
<Property name="Author"></Property>

<Markup name="Text">Dette er endnu en test</Markup>

</Document>

</Group>

<Group property="scSection" value="gruppe2" count="0" size="97" header="" header-href="Sitesoegning.aspx?group=_disabled&amp;id=&amp;sections=gruppe 2" />
<Group property="scSection" value="gruppe3" count="0" size="1" header="" header-href="Sitesoegning.aspx?group=_disabled&amp;id=&amp;sections=gruppe 3" />


</GroupInfo>

</SearchResult>




<Html>

<ClickScript>&lt;script&gt;&lt;!-- function ankclk(lnk,pos){if(document.images){(new Image()).src="/search/click.aspx?q="+escape(lnk.href)+"&amp;pos="+escape(pos)+"&amp;id={87ab58a7-310e-456b-912c-33401b4197ee}";}return true;} //--&gt; &lt;/script&gt;</ClickScript>
<Strings>

<String field="NormalResultsLeftHeader"></String>
<String field="NormalResultsRightHeader"></String>
<String field="NextPageLinkTitle"></String>
<String field="DisplayCategoryResultsLinkTitle"></String>
<String field="LastUpdated"></String><String field="PrevPageLinkTitle"></String>
<String field="NextPageLinkTitle"></String><String field="NoResultsText"></String>

</Strings>

</Html>
</Search>
Avatar billede arne_v Ekspert
18. februar 2009 - 15:03 #1
doc.SelectNodes("//Search/SearchResult/Group/GroupInfo/Document/Property[name='scSection']/text()")

vil give dig alle scSection vaerdierne.

Saa laver du en Dictionary<string,int> hvor fu bruger scSection som key og antal som value.
Avatar billede lasserasch Juniormester
18. februar 2009 - 15:14 #2
Puha.... Det ser jo let ud. Men forstår det stadig ikke helt.

doc er mit xmldocument object korrekt?

Hvordan laver jeg det Dictionary? Det kan jeg ikke helt regne ud?

Mvh.
Lasse
Avatar billede arne_v Ekspert
18. februar 2009 - 15:25 #3
Ja.

Dictionary<string,int> count = new Dictionary<string,int>();

og naar der skal taelles op:

if(count.ContainsKey(section))
{
    count[section]++;
}
else
{
    count[section] = 1;
}
Avatar billede lasserasch Juniormester
18. februar 2009 - 15:32 #4
Hmmm, jamen jeg forstår ikke helt hvor sammenhængen er mellem dictionary og det xmlnodelist objekt som .SelecNodes() retunerer?

Jeg kan se at du har sat Group før GroupInfo. Er det rigtigt?

Uanset om jeg prøver med den du har skrevet eller hvor jeg bytter om på Group og GroupInfo, så bliver xmlnodelisten tom. (count = 0).

gør jeg noget galt?

Min kode ser sådan ud nu:

private void button1_Click(object sender, EventArgs e)
{
      XmlDocument docNav = new XmlDocument();
      docNav.Load("c:\\test2.xml");

    XmlNodeList nodelist = docNav.SelectNodes("//Search/SearchResult/Group/GroupInfo/Document/Property[name='scSection']/text()");
    int count = nodelist.Count;
    }
  }

Mvh.
Lasse
Avatar billede arne_v Ekspert
18. februar 2009 - 15:53 #5
du itererer over din nodelist og node.Value er saa section
Avatar billede arne_v Ekspert
18. februar 2009 - 15:54 #6
XPath skal matche din XML - jeg har bare tastet ind, men du maa vel kende dit eget format meget bedre end mig.
Avatar billede lasserasch Juniormester
18. februar 2009 - 16:19 #7
Jamen det er netop det... Jeg er fuldstændig blank hvad XML angår.


Lige nu har jeg følgende C# kode:

private void button1_Click(object sender, EventArgs e) {
      XmlDocument docNav = new XmlDocument();
      docNav.Load("c:\\test2.xml");

     
    XmlNodeList nodelist = docNav.SelectNodes("//Search/SearchResult/GroupInfo/Group/Document/Property[name='scSection']/text()");
    Dictionary<string, int> count = new Dictionary<string, int>();
      int i = 0;
      foreach (XmlNode node in nodelist)
      {
        count.Add(node.Value, i);
        i++;
      }
    }

Og herunder er hele min XML. Jeg aner simpelthen ikke hvorfor det ikke virker. Jeg synes alt ser korrekt ud, og XML'en kan jeg også sagtens indlæse i en XML Reader applikaiton uden fejl, så det må jo være min kode der ikke er korrekt...

Mvh.
Lasse




<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<Search id="{87ab58a7-310e-456b-912c-33401b4197ee}">
<SearchResult offset="0" num-results="10" total-num-results="142" search-time="14.9625" sort-time="0.3783" result-xml-build-time="5.189" dictionary-time="0.919" total-time="20.229" group-mode="enabled" next-page-href="/Sitesoegning.aspx?group=_disabled&amp;id=&amp;page=2">

<GroupInfo>
<Group property="scSection" value="Andet" count="10" size="26" header="" header-href="xxx.aspx?group=_disabled&amp;id=&amp;sections=Andet">

<Document name="{AD06AE28-0C7B-41F2-BF14-CC49CC7DE38C}" docid="845" created="16-10-2008 09:33:01" updated="16-10-2008 09:33:01" created-iso="2008-10-16T09:33:01" updated-iso="2008-10-16T09:33:01" parent-path="/" index="xx.xxx" language="1030" weight="0.8800" weight-permille="879" position="1">

<Property name="scID">{AD06AE28-0C7B-41F2-BF14-CC49CC7DE38C}</Property>
<Property name="scName">Navn</Property>
<Property name="scPath">/sti</Property>
<Property name="scUri">/sti/filnavn.aspx</Property>
<Property name="scUpdated" value="23-07-2007 23:40:33" value-iso="2007-07-23T23:40:33" />
<Property name="scUpdatedBy">domain\xx</Property>
<Property name="scSection">Andet</Property>
<Property name="Title">Titel</Property>
<Property name="Author"></Property>

<Markup name="Text">Dette er en test</Markup>

</Document>

<Document name="{AD06AE28-0C7B-41F2-BF14-CC49CC7DE38C}" docid="845" created="16-10-2008 09:33:01" updated="16-10-2008 09:33:01" created-iso="2008-10-16T09:33:01" updated-iso="2008-10-16T09:33:01" parent-path="/" index="xx.xxx" language="1030" weight="0.8800" weight-permille="879" position="1">

<Property name="scID">{AD06AE28-0C7B-41F2-BF14-CC49CC7DE38C}</Property>
<Property name="scName">Navn 2</Property>
<Property name="scPath">/sti 2</Property>
<Property name="scUri">/sti/filnavn2.aspx</Property>
<Property name="scUpdated" value="23-07-2007 23:40:33" value-iso="2007-07-23T23:40:33" />
<Property name="scUpdatedBy">domain\xx2</Property>
<Property name="scSection">Andet</Property>
<Property name="Title">Titel2</Property>
<Property name="Author"></Property>

<Markup name="Text">Dette er endnu en test</Markup>

</Document>

</Group>

<Group property="scSection" value="gruppe2" count="0" size="97" header="" header-href="Sitesoegning.aspx?group=_disabled&amp;id=&amp;sections=gruppe 2" />
<Group property="scSection" value="gruppe3" count="0" size="1" header="" header-href="Sitesoegning.aspx?group=_disabled&amp;id=&amp;sections=gruppe 3" />


</GroupInfo>

</SearchResult>
</Search>
Avatar billede arne_v Ekspert
18. februar 2009 - 16:38 #8
Jeg manglede en @ foran name.

Foelgende ser ud til at virke:

using System;
using System.Collections.Generic;
using System.Xml;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(@"C:\search.xml");
            Dictionary<string, int> count = new Dictionary<string, int>();
            foreach(XmlNode n in doc.SelectNodes("//Search/SearchResult/GroupInfo/Group/Document/Property[@name='scSection']/text()"))
            {
                string section = n.Value;
                if(count.ContainsKey(section))
                {
                    count[section]++;
                }
                else
                {
                    count[section] = 1;
                }                
            }
            foreach(string section in count.Keys)
            {
                Console.WriteLine(section + " " + count[section]);
            }
            Console.ReadKey();
        }
    }
}
Avatar billede lasserasch Juniormester
18. februar 2009 - 20:55 #9
Hej Arne. Super.

Jeg vil forsøge at implementere det imorgen tidlig når jeg sidder foran udviklingsmaskinen igen.

Tak for hjælpen.

Smider du et svar :-)

Mvh.
Lasse
Avatar billede arne_v Ekspert
18. februar 2009 - 21:15 #10
svar
Avatar billede arne_v Ekspert
18. februar 2009 - 21:15 #11
Maaske kunne man lave noget smart med LINQ to XML, hvis du er paa 3.5 !
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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