Avatar billede the_party_dog Nybegynder
03. januar 2005 - 16:44 Der er 24 kommentarer og
2 løsninger

XML læs og indsæt

Jeg er lige startet på et mindre projekt i C# hvor jeg vil lave et kostplanlægnings program.

Jeg har en grund form af en xml fil, som jeg gerne vil indlæse, og lede efter en dato, hvis datoen findes, skal der indsættes data mellem dato elementet.

<?xml version="1.0" encoding="utf-8" ?>
<DietPlan>
    <Day Date="03-01-2005">
        <Meal Category="Dinner">
            <ArticleElement ID="0101">
                <Amount>150</Amount>
            </ArticleElement>
            <ArticleElement ID="0001">
                <Amount>100</Amount>
            </ArticleElement>
            <ArticleElement ID="1212">
                <Amount>160</Amount>
            </ArticleElement>
        </Meal>
        <Meal Category="Lunch">
            <ArticleElement ID="0990">
                <Amount>150</Amount>
            </ArticleElement>
        </Meal>
    </Day>
    <Day Date="04-01-2005">
        <Meal Category="BreakFirst">
            <ArticleElement ID="0125">
                <Amount>60</Amount>
            </ArticleElement>
            <ArticleElement ID="0250">
                <Amount>150</Amount>
            </ArticleElement>
        </Meal>
        <Meal Category="Lunch">
            <ArticleElement ID="1245">
                <Amount>289</Amount>
            </ArticleElement>
        </Meal>
    </Day>
</DietPlan>

Jeg har prøvet med XmlTextReader, og ved hjælp af den, kan jeg godt finde den ønskede dag. Men jeg kan ikke læse data'en ud i en ny fil, for at indsætte det data jeg ønsker.

Nogen som kan hjælpe, eller lede mig på vej?
Avatar billede martin_maage Nybegynder
03. januar 2005 - 17:07 #1
Du skal tage og kigge på DataSet, som er meget nemt at arbejde med. MSDN dokumentationen som du kan slå op på www.msdn.com eller hvis du bruger VS.net, kan du læse meget mere om brugen af dataset.
Avatar billede the_party_dog Nybegynder
03. januar 2005 - 17:09 #2
Jeg har rodet lidt med DataSet tidligere i mine andre programmer.... Jeg kan bare ikke se hvordan jeg kan indsætte data ind i et dataset, som har læst min xml fil.

Det jeg ønsker at opnå, er at jeg f.eks finder <Day Date="03-01-2005">, og vil indsætte en nyt <Meal> Element. Hvordan opnår jeg det med et dataset?
Avatar billede martin_maage Nybegynder
03. januar 2005 - 17:16 #3
Jeg er desværre ikke så god til det med xml endnu, jeg har kun arbejdet lidt med simple dataset som højest går 1 nivaeu dybt. Men held og løkke
Avatar billede jimgordon Nybegynder
03. januar 2005 - 17:54 #4
Avatar billede segato Nybegynder
04. januar 2005 - 18:17 #5
Du skal læse dine data ind i et XmlDocument og så bruge xpath. Det er en function i XmlDocument der heder SelectNodes eller SelectNode som tager en xpath. Sådan ville jeg løse det.
Avatar billede the_party_dog Nybegynder
05. januar 2005 - 08:00 #6
Hvordan virker Xpath? Kan jeg med hjælp af den, finde et element, eller en node, og indsætte noget mere data mellem et "Day" element?
Avatar billede arne_v Ekspert
05. januar 2005 - 08:06 #7
Du kan finde et element ved hjælp af XPath.

(det er også i artiklen)
Avatar billede the_party_dog Nybegynder
05. januar 2005 - 08:08 #8
okay, at finde det lyder godt nok. Men kan I svare mig på, om det er muligt at jeg kan indsætte data i det element jeg finder? Bare en lille ledetråd i den retning jeg skal gå i.

Det jeg er vil, er at jeg vil kunne sætte et nyt "Meal" element ind under et ønsket "Day" element.
Avatar billede arne_v Ekspert
05. januar 2005 - 08:10 #9
Ja - du kan også indsætte data i et element du har fundet.
Avatar billede the_party_dog Nybegynder
05. januar 2005 - 08:11 #10
Har du tid og lyst til at vise hvad retning jeg skal gå i? Det er helt iorden hvis du ikke har, men kan ikke lige helt se mig ud af det her. En hjælpende hånd ville være meget velkommen, og værdsat.
Avatar billede arne_v Ekspert
05. januar 2005 - 08:13 #11
Har du læst den artikel som jimgordon linkede til ?

Den har faktisk eksempler på det meste !
Avatar billede the_party_dog Nybegynder
05. januar 2005 - 08:17 #12
I den artikel kan jeg godt se hvordan man tilføjer et nyt element, men det element kommer til at ligge i bunden af xml dokumentet. Kan ikke lige se hvordan jeg skal kunne få det til at virke, så jeg finder et bestemt element, og indsætter ny data ind i det element.
Avatar billede arne_v Ekspert
05. januar 2005 - 08:22 #13
I eksemplet i artiklen bliver det nye element lagt i bunden af XML filen.

Men det er udelukkende fordi der bruges doc.DocumentElement.AppendChild til
at appende det nye element med (doc.DocumentElement er det yderste tag).

Hvis du bruger elementfundetmedxpath.AppendChild så bliver det nye element
lagt under det element du har fundet.
Avatar billede the_party_dog Nybegynder
05. januar 2005 - 08:27 #14
Lige hurtigt arne_v...

Hvordan ville jeg så skulle finde et bestemt day element med xpath? Jeg bruger jo attributes, hvor man i din udemærket artikel, ser hvordan du finder et element ved hjælp af dens child element...
Avatar billede arne_v Ekspert
05. januar 2005 - 08:31 #15
XPath med attributter bruger syntaxen:

doc.DocumentElement.SelectNodes("elementnavn/underelementnavn[@attributnavn='værdi']")

attributter skal bare prefixes med @
Avatar billede segato Nybegynder
05. januar 2005 - 08:45 #16
Du skal tænke på SelectNodes returnere de elementer fra dit xmldokument som du angiver i din xpath. Ud fra et element kan du gøre alt du vil. tilføje attributter, nye childs, slette den node du har hentet ind osv osv. Så du har fuld kontrol over det du vil. Det er meget brugbart når man arbejder med søgninger i xml personligt er jeg ikke glad for datasettet i sådanne scenarioer.

XmlNode node = doc.DocumentElement.SelectSingleNode("elementnavn/underelementnavn[@attributnavn='værdi']");

node.Atributtes.Add("et eller andet her") osv osv.
Avatar billede the_party_dog Nybegynder
05. januar 2005 - 08:46 #17
Det fandt jeg også lige noget om segato, men mange tak for din streng, må jeg lige af teste tingene i løbet af dagen, og vende tilbage?
Avatar billede the_party_dog Nybegynder
05. januar 2005 - 10:29 #18
Nu har jeg fundet det element jeg ønsker, og prøvet på at tilføje et nyt element under det. Sådan her:

XmlDocument doc = new XmlDocument();
doc.Load(@"C:\kostplan.xml");   

string strDay = "03-01-2005";
XmlNode DaySelected = doc.DocumentElement.SelectSingleNode("Day[@Date='"+ strDay +"']");

Så prøver jeg på at oprette et nyt element, som jeg vil have indsat i "DaySelected" elementet.

XmlNode eleMeal = doc.CreateElement("Meal");
XmlAttribute atrMeal = doc.CreateAttribute("Category");
XmlText txtMealatr = doc.CreateTextNode("BreakFirst");

atrMeal.AppendChild(txtMealatr);
eleMeal.Attributes.Append(atrMeal);     


Hvordan får jeg så indsat mit "eleMeal" til mit dokument, lige under det element jeg har fundet via Xpath? Jeg har prøvet lidt frem og tilbage med:

doc.DocumentElement.InsertAfter(eleMeal, DaySelected.ChildNodes[0]);

Men får en fejl: The reference node is not a child of this node.

Jeg troede det hele blev "nedarvet" så alt hang sammen med hinanden, men logisk set, kan jeg godt se hvorfor jeg får min fejl. Fordi childnode[0] fra dayselected, ikke er et direkte child fra selve dokumentet.

Hvordan fortæller jeg så mit doc, at jeg vil indsætte en ny node, til en childnode af selve dokumentet?
Avatar billede arne_v Ekspert
05. januar 2005 - 11:11 #19
Prøv og kald:

DaySelected.AppendChild(eleMeal);
Avatar billede the_party_dog Nybegynder
05. januar 2005 - 11:42 #20
Det virker.... Men hvordan? Undskyld mine mange dumme spørgsmål.

Er min DaySelected en ref til selve elementet i mit xml dokument? Er det derfor at ændringerne bliver gemt, når jeg kalder doc.Save()?
Avatar billede arne_v Ekspert
05. januar 2005 - 11:50 #21
I C# er alle "class objekter" i virkeligheden referencer til objekter.

DaySelected er en reference til et element i træet.
Avatar billede the_party_dog Nybegynder
05. januar 2005 - 11:51 #22
også fordi jeg kalder AppendChild() fra DaySelected, bliver ændringerne gemt inde i mit dokument, når jeg kalder Save()?
Avatar billede segato Nybegynder
05. januar 2005 - 15:33 #23
Du har en node så det er kun under den node du kan indsætte andre nodes. Hvis du vil appende den som sibling skal du skrive node.Parent.Append(....

Når du har kaldt append er ændringen fortaget i din dom. Save er til en fil eller lign.
Avatar billede arne_v Ekspert
05. januar 2005 - 20:16 #24
Save er en metode på doc og gemmer naturligvis doc.
Avatar billede arne_v Ekspert
05. januar 2005 - 20:17 #25
og et svar
Avatar billede the_party_dog Nybegynder
06. januar 2005 - 08:05 #26
Føler at I begge har været til meget stor hjælp, med hver jeres indlæg. Jeg bukker og takker mange gange, samtidige med at jeg undskylder for mine dumme spørgsmål.
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