Avatar billede timelord Nybegynder
15. december 2010 - 22:55 Der er 19 kommentarer og
2 løsninger

Læser alle informationer fra XML

Jeg har en XML som ser sådan ud:

<string>
  <guidedenmark>
    <content>
      <product requeststatus="O">
        <identity>
          <productareaname>Aktiviteter</productareaname>
          <productdefinitionname>Shopping</productdefinitionname>
          <internalname>Anytime</internalname>
          <uuid>570</uuid>
          <currentstatus>O</currentstatus>
          <organisationcsid>61</organisationcsid>
          <organisationdisplayname>Tønder Turistbureau</organisationdisplayname>
          <organisationurl>http://www.tonder.dk</organisationurl>
          <organisationemail>r@r.dk</organisationemail>
        </identity>
        <changelog>
          <createdbycsid>54</createdbycsid>
          <createddate>2009-01-03T15:55:38</createddate>
          <lastmodifiedbycsid>44</lastmodifiedbycsid>
          <lastmodifieddate>2010-11-29T14:23:07</lastmodifieddate>
          <approvedbycsid>54</approvedbycsid>
          <approveddate>2010-11-29T14:23:07</approveddate>
        </changelog>
        <address>
          <place />
          <road>Storegade </road>
          <housenumber>18</housenumber>
          <floor />
          <side />
          <subcity />
          <postalcode>6780</postalcode>
          <city>Skærbæk</city>
          <country />
          <geocodex>485050,414465534</geocodex>
          <geocodey>6112636,47891116</geocodey>
          <latitude>55.158287</latitude>
          <longitude>8.764077</longitude>
        </address>
        <belongtocities>
          <belongtocity>Skærbæk</belongtocity>
        </belongtocities>
        <facilities>
          <facility isrequired="true" sortorder="0">
            <productdefinitionname>Shopping</productdefinitionname>
            <internalname>Navn</internalname>
            <value>
              <text type="varchar512" maxlength="512">
                <localversion culture="da-dk">Anytime</localversion>
                <localversion culture="en-gb">Anytime</localversion>
                <localversion culture="de-de">Anytime</localversion>
              </text>
            </value>
          </facility>
          <facility isrequired="true" iscomposite="true" sortorder="0">
            <productdefinitionname>Shopping</productdefinitionname>
            <internalname>Globale felter</internalname>
            <facility isrequired="true" sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Beskrivelse</internalname>
              <value>
                <text type="text" maxlength="16392">
                  <localversion culture="da-dk">Køb dine smykker hos os.</localversion>
                  <localversion culture="en-gb">Buy your jewelry at Anytime.</localversion>
                  <localversion culture="de-de">Kaufen Sie Ihren Schmuck bei uns.</localversion>
                </text>
              </value>
            </facility>
            <facility sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Primær billede</internalname>
              <value>
                <binary type="binary.base64" size="1024" mimetype="image/jpeg" alttext="">4AAQSkZJRgABAgAAZABkAAD</binary>
              </value>
            </facility>
            <facility sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Sekundær billede</internalname>
              <value>
                <binary type="binary.base64" size="-1" mimetype="" alttext="" />
              </value>
            </facility>
            <facility isrequired="true" sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Billede 1</internalname>
              <value>
                <binary type="binary.base64" size="5949" mimetype="image/jpeg" >4AAQSkZJRgABAgAAZABkAAD</binary>
              </value>
            </facility>
            <facility sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Billede 2</internalname>
              <value>
                <binary type="binary.base64" size="-1" mimetype="" alttext="" />
              </value>
            </facility>
            <facility sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Billede 3</internalname>
              <value>
                <binary type="binary.base64" size="-1" mimetype="" alttext="" />
              </value>
            </facility>
            <facility sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Billede 4</internalname>
              <value>
                <binary type="binary.base64" size="-1" mimetype="" alttext="" />
              </value>
            </facility>
            <facility sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Billede 5</internalname>
              <value>
                <binary type="binary.base64" size="-1" mimetype="" alttext="" />
              </value>
            </facility>
            <facility sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Billede 6</internalname>
              <value>
                <binary type="binary.base64" size="-1" mimetype="" alttext="" />
              </value>
            </facility>
            <facility sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Billede 7</internalname>
              <value>
                <binary type="binary.base64" size="-1" mimetype="" alttext="" />
              </value>
            </facility>
            <facility sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Billede 8</internalname>
              <value>
                <binary type="binary.base64" size="-1" mimetype="" alttext="" />
              </value>
            </facility>
            <facility sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Billede 9</internalname>
              <value>
                <binary type="binary.base64" size="-1" mimetype="" alttext="" />
              </value>
            </facility>
            <facility sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Billede 10</internalname>
              <value>
                <binary type="binary.base64" size="-1" mimetype="" alttext="" />
              </value>
            </facility>
          </facility>
          <facility iscomposite="true" sortorder="0">
            <productdefinitionname>Shopping</productdefinitionname>
            <internalname>Kontakt</internalname>
            <facility sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Telefon</internalname>
              <value>
                <citext type="varchar512" maxlength="512">74751222</citext>
              </value>
            </facility>
            <facility sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Fax</internalname>
              <value>
                <citext type="varchar512" maxlength="512" />
              </value>
            </facility>
            <facility iscomposite="true" sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Website Global</internalname>
              <facility sortorder="0">
                <productdefinitionname>Shopping</productdefinitionname>
                <internalname>NavigateUrl</internalname>
                <value>
                  <citext type="varchar512" />
                </value>
              </facility>
              <facility sortorder="0">
                <productdefinitionname>Shopping</productdefinitionname>
                <internalname>NavigateText</internalname>
                <value>
                  <citext type="varchar512" maxlength="512" />
                </value>
              </facility>
            </facility>
            <facility sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>E-mail</internalname>
              <value>
                <citext type="varchar512" maxlength="512" />
              </value>
            </facility>
            <facility sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Telefon2</internalname>
              <value>
                <citext type="varchar512" maxlength="512" />
              </value>
            </facility>
          </facility>
          <facility isenumerated="true" sortorder="0">
            <productdefinitionname>Shopping</productdefinitionname>
            <internalname>Kommuneoplysninger</internalname>
            <value>
              <enum type="enum" choicelistculture="da-dk">58</enum>
            </value>
          </facility>
          <facility isenumerated="true" sortorder="0">
            <productdefinitionname>Shopping</productdefinitionname>
            <internalname>Branche Shopping</internalname>
            <value>
              <enum type="enum" choicelistculture="da-dk">717</enum>
            </value>
          </facility>
          <facility sortorder="0">
            <productdefinitionname>Shopping</productdefinitionname>
            <internalname>salg miljømærkede varer</internalname>
            <value>
              <numeric type="int">0</numeric>
            </value>
          </facility>
          <facility isrequired="true" multiplicity="true" iscomposite="true" sortorder="0">
            <productdefinitionname>Shopping</productdefinitionname>
            <internalname>Åbningsperioder</internalname>
            <facility isrequired="true" iscomposite="true" sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Åbningsperiode</internalname>
              <facility iscomposite="true" sortorder="0">
                <productdefinitionname>Shopping</productdefinitionname>
                <internalname>Periode</internalname>
                <facility sortorder="0">
                  <productdefinitionname>Shopping</productdefinitionname>
                  <internalname>Dato fra</internalname>
                  <value>
                    <datetime type="datetime" restrictions="">2010-01-01T00:00:00</datetime>
                  </value>
                </facility>
                <facility sortorder="0">
                  <productdefinitionname>Shopping</productdefinitionname>
                  <internalname>Dato til</internalname>
                  <value>
                    <datetime type="datetime" restrictions="">2015-01-01T00:00:00</datetime>
                  </value>
                </facility>
              </facility>
              <facility isenumerated="true" sortorder="0">
                <productdefinitionname>Shopping</productdefinitionname>
                <internalname>Ugedage</internalname>
                <value>
                  <enum type="enum" choicelistculture="da-dk">2</enum>
                </value>
              </facility>
              <facility iscomposite="true" sortorder="0">
                <productdefinitionname>Shopping</productdefinitionname>
                <internalname>Tidsinterval</internalname>
                <facility sortorder="0">
                  <productdefinitionname>Shopping</productdefinitionname>
                  <internalname>Tid fra</internalname>
                  <value>
                    <datetime type="datetime" restrictions="">0001-01-01T00:00:00</datetime>
                  </value>
                </facility>
                <facility sortorder="0">
                  <productdefinitionname>Shopping</productdefinitionname>
                  <internalname>Tid til</internalname>
                  <value>
                    <datetime type="datetime" restrictions="">0001-01-01T00:00:00</datetime>
                  </value>
                </facility>
              </facility>
            </facility>
          </facility>
          <facility sortorder="0">
            <productdefinitionname>Shopping</productdefinitionname>
            <internalname>Skaller</internalname>
            <value>
              <numeric type="int">0</numeric>
            </value>
          </facility>
          <facility multiplicity="true" iscomposite="true" sortorder="0">
            <productdefinitionname>Shopping</productdefinitionname>
            <internalname>Eksterne reviews</internalname>
          </facility>
          <facility iscomposite="true" sortorder="0">
            <productdefinitionname>Shopping</productdefinitionname>
            <internalname>Andre medier</internalname>
            <facility isrequired="true" iscomposite="true" sortorder="0">
              <productdefinitionname>Shopping</productdefinitionname>
              <internalname>Andet medie</internalname>
              <facility sortorder="0">
                <productdefinitionname>Shopping</productdefinitionname>
                <internalname>Translateable navigateUrl</internalname>
                <value>
                  <text type="varchar512">
                    <localversion culture="da-dk">www.xxx.dk</localversion>
                    <localversion culture="en-gb">www.xxx.co.uk</localversion>
                    <localversion culture="de-de">www.xxx.de</localversion>
                  </text>
                </value>
              </facility>
              <facility sortorder="0">
                <productdefinitionname>Shopping</productdefinitionname>
                <internalname>Translateable navigateText</internalname>
                <value>
                  <text type="varchar512" maxlength="512">
                    <localversion culture="da-dk">xxx</localversion>
                    <localversion culture="en-gb">xxx</localversion>
                    <localversion culture="de-de">xxx</localversion>
                  </text>
                </value>
              </facility>
            </facility>
          </facility>
        </facilities>
      </product>
    </content>
  </guidedenmark>
</string>

Denne XML har kun et product, men i den endelige er der mange

Den prøver jeg så at læse med min kode i C#.
Jeg gennemløber alle noder i product (i eksemplet 1, men i den endelige er der mange flere). Jeg gemmer værdierne i ArrayList, en for hver node værdi jeg vælger at bruge. F.eks "Identityproductareaname"

MIN KODE: (se kommentarer i koden)

                XmlDocument xml = new XmlDocument();
                xml.LoadXml(XMLStringDoc); ==XMLStringDoc er en streng med ovenstående XML

                //** Find alle standard felter
                Denne løber alle node i Product igennem, det virker fint
                XmlNodeList xnList = xml.SelectNodes("/string/guidedenmark/content/product");
                foreach (XmlNode node in xnList)
                {
                    Identityproductareaname.Add(node["identity"]["productareaname"].InnerText);
                    Identityproductdefinitionname.Add(node["identity"]["productdefinitionname"].InnerText);
                    Identityinternalname.Add(node["identity"]["internalname"].InnerText);
                    Identityuuid.Add(node["identity"]["uuid"].InnerText);
                    Identitycurrentstatus.Add(node["identity"]["currentstatus"].InnerText);
                    Identityorganisationcsid.Add(node["identity"]["organisationcsid"].InnerText);
                    Identityorganisationdisplayname.Add(node["identity"]["organisationdisplayname"].InnerText);
                    Identityorganisationurl.Add(node["identity"]["organisationurl"].InnerText);
                    Identityorganisationemail.Add(node["identity"]["organisationemail"].InnerText);

                    Changelogcreatedbycsid.Add(node["changelog"]["createdbycsid"].InnerText);
                    Changelogcreateddate.Add(node["changelog"]["createddate"].InnerText);
                    Changeloglastmodifiedbycsid.Add(node["changelog"]["lastmodifiedbycsid"].InnerText);
                    Changeloglastmodifieddate.Add(node["changelog"]["lastmodifieddate"].InnerText);
                    Changelogapprovedbycsid.Add(node["changelog"]["approvedbycsid"].InnerText);
                    Changelogapproveddate.Add(node["changelog"]["approveddate"].InnerText);

                    Addressplace.Add(node["address"]["place"].InnerText);
                    Addressroad.Add(node["address"]["road"].InnerText);
                    Addresshousenumber.Add(node["address"]["housenumber"].InnerText);
                    Addressfloor.Add(node["address"]["floor"].InnerText);
                    Addressside.Add(node["address"]["side"].InnerText);
                    Addresscity.Add(node["address"]["subcity"].InnerText);
                    Addresspostalcode.Add(node["address"]["postalcode"].InnerText);
                    Addresscity.Add(node["address"]["city"].InnerText);
                    Addresscountry.Add(node["address"]["country"].InnerText);
                    Addressgeocodex.Add(node["address"]["geocodex"].InnerText);
                    Addressgeocodey.Add(node["address"]["geocodey"].InnerText);
                    Addresslatitude.Add(node["address"]["latitude"].InnerText);
                    Addresslongitude.Add(node["address"]["longitude"].InnerText);

                    Belongtocitiesbelongtocity.Add(node["belongtocities"]["belongtocity"].InnerText);

                    Denne her skal løbe alle Facilities node igennem for hver node, men det er her jeg får problemer
                    foreach (XmlNode nodeFacilities in node)
                    {
                        Her vil jeg gerne løbe alle "Facility" felter igennem i Facilities, men ved ikke rigtig hvordan jeg skal (har prøvet meget)
                    }
                }

Jeg har prøvet mange ting, men det er ikke rigtig lykkedes for mig endnu. Jeg får programmet til at løbe igennem noderne og får f.eks 136 noder under Product, men måske kun 4 under email og det dur simpelhen ikke. Jeg har en ide om at jeg for hver product skal hente nogle værdier og under product/facilities skal hente en hel række som høre under den første product node.

Er der nogen der kan hjælpe mig lidt på vej. I sær ved "<localversion culture="da-dk"" hvor jeg skal hente 3 værdier for en node kan jeg ikke rigtig gennemskue hvad der sker.

Hvis nogen kan hjælpe lidt med kodeeksempler vil det være fint. Undgå venligt at give mig links til sider med C#/XML, jeg har næsten prøvet alle de sider jeg kan finde og stadig uden held.

Jeg tror næsten det er en lille ting, men jeg kan BARE ikke se det.
Avatar billede Syska Mester
15. december 2010 - 23:04 #1
Du skal vel gøre som i starten.

foreach(var subNode in note.SelectNodes())
{
}

Kun et gæt ... da den node du er på må have nogen subnodes ... men du skal selvf have den rigtige XPath ind ...

/Facilities/Facility
Avatar billede timelord Nybegynder
15. december 2010 - 23:30 #2
Kan du være lidt mere konkret, mener du f.eks.


foreach(var subNode in note.SelectNodes("/Facilities/Facility))
{
}
????
Avatar billede timelord Nybegynder
15. december 2010 - 23:33 #3
Men for mig at se er der flere facility under facilities som ikke fanges af den samme løkke
Avatar billede Syska Mester
15. december 2010 - 23:42 #4
Hej,

Ja ... men det er jo så fordi en Facility kan have en Facility ...

Virker som et lidt mærkeligt design af en XML fil.

Men det er klart at den ikke fanger

/fac/fac/fac ... men kun alle fac under facs.

Så bliver du nok nød til at lave en rekursiv methode hvis det scenarie kan forekomme.

mvh
Avatar billede timelord Nybegynder
15. december 2010 - 23:46 #5
Hvis du kigger på elementet Fax, det findes jo i en facility under en facility.
Skal jeg så køre en løkke i min løkke som køre i min product løkke?
(håber du forstår hvad jeg mener)
Avatar billede Syska Mester
15. december 2010 - 23:56 #6
Præcis ...

Det skulle jeg måske have skrevet i mit første indlæg ...

og note skulle være node


dvs.


foreach(var p in productsNodes)
{
// hent product data ud
foreach(var f in p.SelectNodes("facnodes"))
{
// Her henter du fac info.
}
}

Men du skal nok lave Fac delen som en metode, da du siger der kan være en fac under en fac ...

/fac
/fac/fac
/fac/fac/fac/fac
/fac

Så vil den selvfølgelig kun tage 4 facs i første hug, men loope igennem igen, og se om en fac har en sub fac.

Håber du forstår ... er i hvert fald ved at være træt her :-)

mvh
Avatar billede timelord Nybegynder
16. december 2010 - 00:00 #7
Du kan se min XML i mit første indlæg. Der kan du se facility i facility.
Jeg er også på vej i seng.
Men du må meget gerne vende tilbage i morgen.
Avatar billede Syska Mester
16. december 2010 - 00:08 #8
Har du prøvet hvad jeg har skrevet ?

Synes ikke jeg har mere input lige nu ...
Avatar billede arne_v Ekspert
16. december 2010 - 02:04 #9
Jeg er enig i at det er usædvaneligt med et den form for nesting, men det bør ikke give problemer.

Både XPath og gode gamle GetElementsByTagName kan fint klare det.

Demo:

using System;
using System.Xml;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string s = @"<doc>
  <foo>
      <bar>
          <elm id='1'>
              <elm id='2'>
                <elm id='3'/>
              </elm>
          </elm>
      </bar>
  </foo>
  <foo>
      <bar>
          <elm id='4'>
              <elm id='5'>
                <elm id='6'/>
              </elm>
          </elm>
      </bar>
  </foo>
</doc>";
            Console.WriteLine(s);
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(s);
            foreach(XmlNode n in doc.SelectNodes("/doc/foo/bar"))
            {
                // use either this one
                foreach(XmlNode n2 in n.SelectNodes(".//elm"))
                {
                    Console.WriteLine(n2.SelectSingleNode("@id").Value);
                }
                // or this one
                foreach(XmlNode n2 in ((XmlElement)n).GetElementsByTagName("elm"))
                {
                    Console.WriteLine(n2.Attributes["id"].Value);
                }
            }
            Console.ReadKey();
        }
    }
}
Avatar billede Syska Mester
16. december 2010 - 14:16 #10
Ahhh, havde helt glemt den method.

Men hvis han vil beholde strukturen, så bliver han vel nød til at gøre det rekursivt.

mvh
Avatar billede arne_v Ekspert
17. december 2010 - 03:30 #11
Det er ikke lige indlysende for mig hvorfor rekursivitet skulle være nødvendigt.
Avatar billede timelord Nybegynder
17. december 2010 - 08:02 #12
Jeg takker for hjælpen til jer begge to.
Hvordan gør vi med points?
Avatar billede Syska Mester
17. december 2010 - 08:54 #13
#arne
Hvordan ville du ellers beholde strukturen fra xml dokumentet i hans object ?
Jeg ville i hvert fald mene det ville gøre det lidt nemmere.


mvh
Avatar billede d3crypt0 Nybegynder
21. december 2010 - 19:34 #14
Der er vel ikke behov for at gemme strukturen af xml dokumentet fra helvede. Nesting i flere lag uden en logisk forbindelse mellem retfærdiggør ikke at beholde strukturen af xml 1-til-1 med C# objektet.

Hvis det drejer sig om at udvinde data fra xml dokumentet, kan det sagtens raffineres ned i et kønnere og mere fuldkomment c# objekt. Jeg kender dog ikke baggrunden for xml dokumentet; navnet 'facility' er ihvertfald ikke et begrænsende begreb, der afgrænser noget logik, men tværtimod en, holder på forskellige logiske definitioner.
Avatar billede Syska Mester
21. december 2010 - 22:41 #15
#d3crypt0
Nej, men nu er det jo heller ikke lige det vi snakker om, men mere hvis han skulle ...

Hvis du skal beholde den struktur, er den vel kun den struktur. Jeg kan ikke lige gennemskue hvordan du vil gøre det nemmere ...

mvh
Avatar billede arne_v Ekspert
25. december 2010 - 03:45 #16
Nu fremgår der jo ikke noget om hvordan C# data strukturen skal se ud for de nestede facility.

Hvis den er flad, så er der ingen grund til rekursivitet.

Men skal de nestes, så er det muligt at rekursivitet er en løsning.
Avatar billede Syska Mester
25. december 2010 - 11:42 #17
Nej, men der var jo heller ingen der sagde den skulle være flad :-)

Nej, hvis den skulle være flad, så ville jeg heller ikke lave det rekursivt.

mvh
Avatar billede arne_v Ekspert
25. december 2010 - 17:04 #18
et stort antal ArrayList med String's til data giver mig klart flade associationer
Avatar billede timelord Nybegynder
30. december 2010 - 13:59 #19
Hvad gør jeg med de points.
Kan i dele dem eller hva?
Avatar billede arne_v Ekspert
02. januar 2011 - 01:06 #20
sagtens

her er et svar fra mig

så venter du på et svar fra buzzzz

og så markerer du begge inden du accepterer
Avatar billede Syska Mester
03. januar 2011 - 17:17 #21
svar.
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