Avatar billede rtb Nybegynder
27. juli 2007 - 23:16 Der er 4 kommentarer og
1 løsning

XmlTextReader til udtrækning af enkelt objekt fra større fil

Jeg er ved at gå lidt sukkerkold i en forholdsvis simpel parsing af en xml-fil. Jeg skal anvende XmlTextReader til at udtrække et objekt "Book" samt alle dets underelementer/noder, udfra en specifik identifier "UnitID".

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfBook>
  <Book Description="HelloWorld" UnitID="1">
    <Repeat>never</Repeat>
    <Frequency>Often</Frequency>
    <Hardback>Yes</Hardback>
    <Readers>
      <Reader>
        <First>John</First>
        <Last>Smith</Last>
        <ReaderID>1</ReaderID>
      </Reader>
      <Reader>
        <First>Lars</First>
        <Last>Jensen</Last>
        <ReaderID>8</ReaderID>
      </Reader>
      <Reader>
        <First>Michael</First>
        <Last>Petersen</Last>
        <ReaderID>3</ReaderID>
      </Reader>
    </Readers>
    </Book>
    <Book Description="PlentyOfByte" UnitID="65">
    <Repeat>never</Repeat>
    <Frequency>Often</Frequency>
    <Hardback>No</Hardback>
    <Readers>
      <Reader>
        <First>Lars</First>
        <Last>Jensen</Last>
        <ReaderID>8</ReaderID>
      </Reader>
      <Reader>
        <First>Jan</First>
        <Last>Snolle</Last>
        <ReaderID>6</ReaderID>
      </Reader>
      <Reader>
        <First>Ronald</First>
        <Last>Blanko</Last>
        <ReaderID>21</ReaderID>
      </Reader>
    </Readers>
  </Book>
</ArrayOfBook>

Xml-filen kan indholde uendeligt antal Books og Book kan indholde et uendeligt antal Readers, så foreslå venligst ikke DOM :o) Jeg kan heller ikke ændre meget i Xml-strukturen, så løsningen skal i princippet blot finde et Book-element med et bestemt UnitID, udtrække hele indholdet af denne til at objekt og afbryde parsing af xml-filen. Tak til alle som giver deres mening og til alle andre sov godt :)
Avatar billede kalp Novice
28. juli 2007 - 00:58 #1
Meningen med XmlTextReader er, at du finder det objekt du er interesseret i og udlæser værdierne i det.
Jeg er for træt til, at gå ind og rode med om man kan hive det ud, som et XmlNode.
Kan man sikkert godt på en speciel måde.

Men skal du bare have værdierne i "Book" så behøver du ikke hive xml noden ud..
der hvor jeg har kommenteret kan du udlæse værdierne og benytte dem til det formål du har.


    XmlTextReader reader = new XmlTextReader(@"sti til xml fil");
            string uniktId = "65";
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                    if (reader.Name == "Book" && reader["UnitID"] != null)
                        if (reader["UnitID"].ToString() == uniktId)
                        {
                            //udlæs værdier
                        }
            }
Avatar billede rtb Nybegynder
28. juli 2007 - 07:44 #2
ok....alt det der har jeg selv klaret, jeg benytter bare MoveToAttribute for tjekke værdien. Der hvor jeg åbenbart bliver lidt forvirret, er når jeg kommer til at skulle udtrække alle forekomster af Reader i Book og skal stoppe med at parse. Hvis der kommer yderligere løsninger, før jeg selv får det løst og meldt tilbage, så står der naturligvis stadig point til rådighed.
Avatar billede kalp Novice
28. juli 2007 - 13:22 #3
okay jeg har ikke arbejdet med den før, men ud fra hvad jeg hurtigt kunne se i går imens jeg gjorde var, at der ikke fandtes en simpel metode til lige, at udtrække den node man nu var nået til (ret upraktisk måske).

men man har adgang til alle elementerne i noden, så man kan jo "bygge" den selv.

Dette link
http://www.examcram2.com/articles/article.asp?p=31696&seqNum=2&rl=1

under dette punkt
STEP BY STEP 2.2 - Using the XmlTextReader Class to Read Selected XML Entities


gør han det...
der lægger det så i en stringbuilder, men som valid xml så du kan oprette noden ved at kalde .CreateElement fra XmlDocument klassen til det.
Avatar billede rtb Nybegynder
29. juli 2007 - 10:04 #4
hej Kalp

Eksemplet på siden viser kun hvordan man udtrækker alle elementer og attributter fra xml-filen. Eksemplet identificerer ikke en konkret Book og stopper derfor heller ikke efterfølgende. Det kan være vi taler forbi hinanden, men det er ikke en brugbar løsning for mig. Det du skriver med ".CreateElement" og "XmlDocument" skal jeg ikke bruge til noget, da Book-elementet og afkom skal smides direkte over i en Book-klasse.
Så jeg må desværre afvise svaret, men ellers tak for forsøget.
Avatar billede rtb Nybegynder
29. juli 2007 - 18:39 #5
har mere eller mindre løst problemet, men har med sikkerhed brugt for meget tid, på en alt for grim løsning. De elementer jeg skulle udtrække lå i dybderne 3 og 5, så ved at indsætte en case sætning i en if statement, kunne jeg håndtere Book og Reader på hver sin måde. Eks:

string id = "6";
bool found = false;
...
...
if (found && (reader.Depth == 3))
{
  switch (nodename)
  {
      case "Repeat":
      bookinf.Repeat = reader.Value;
      break;
...//etc
...
  }
}
else if (found && (reader.Depth == 5))                   

  switch (nodename)
  {
      case "First":
      rd.First = reader.Value;
      break;
...etc
...
  }
}

For at stoppe min XmlTextReader valgte jeg bare terminere løkken ved starten på den næste Book, hvis unikID ikke stemte overens med parametren.
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