Avatar billede wmann Nybegynder
08. februar 2008 - 12:09 Der er 11 kommentarer

XML leg

Jeg skal have fundet en måde at kunne redigere i et xml-dokument.
Således så jeg kan skrive og oprette et dokument og så 3 sek senere søge i det og finde stedet lige før sidste sluttag, og så skrive nye tags og info ind, gemme osv.
Og til allersidst skal jeg kunne slette filen helt igen.

Jeg kan sagtens finde ud af og oprette filen, og også udtrække data fra xml'en men ikke skrive et specifikt sted inde midt i dokumentet.
Plus jeg ved ikke hvordan jeg skal slette det til sidst fra filsystemet.
Avatar billede wisen Nybegynder
08. februar 2008 - 12:13 #1
Den nemmeste måde at manipulere XML-filer i .NET er at bruge XMLDocument - den har bla. metoder til at sætte nye tags ind i dokumentet, derudover kan den læse og gemme direkte til en fil.

Filer kan du slette via System.IO.File.Delete();
Avatar billede wisen Nybegynder
08. februar 2008 - 12:15 #2
Avatar billede wmann Nybegynder
08. februar 2008 - 12:46 #3
Følgende kode er fra eksemplet:
XmlElement elem = doc.CreateElement("price");
XmlText text = doc.CreateTextNode("19.95");
doc.DocumentElement.AppendChild(elem);
doc.DocumentElement.LastChild.AppendChild(text);

1. CreateElement - Kommer den ind efter </book> eller efter </title>?
2. Og append child vil vel give en <element> under <title>?
Vil strukturen blive som 1 eller 2?

1)
<book>
  <title>
    <price></price>
  </title>
</book>

2)
<book>
  <title></title>
  <price></price>
</book>

3. Og vil "doc.DocumentElement.LastChild.AppendChild(text);" give tekst imellem elementerne eller som attribut?

Imellem Element: <price>19.95</price>
attribut: <price = '19.95'> </price>
Avatar billede jokkejensen Novice
08. februar 2008 - 12:58 #4
Jeg ville fange den sidste node med xpath :

http://support.microsoft.com/kb/317018

/JJ
Avatar billede wisen Nybegynder
08. februar 2008 - 13:16 #5
1. CreateElement gør ikke noget i forhold til dokumentet - den laver kun et nye element, det er op til dig hvor det skal puttes ind

2. XMLDocument.DocumentElement svarer til roden i XML dokumentet - i dette tilfælde "book", det er på dette element man kalder "AppendChild" så derfor bliver resultatet struktur 2.

3. Ja - det er en TextNode man appender, svarende til teksten imellem start- og slut tagget. Der er tilsvarende metoder til at appende attributter på et element
Avatar billede wisen Nybegynder
08. februar 2008 - 13:19 #6
Du behøver ikke at bruge XPath for at finde det sidste element - det er der metoder til på et XmlElement - tilsvarende er der metoder til "InsertBefore" og "InsertAfter".. AppendChild sætter altid ind "i bunden"
Avatar billede wmann Nybegynder
08. februar 2008 - 13:33 #7
jokke
Sorry men kan ikke gennemskue xpath's opsætning og kryptiske defination man skal sætte op på en "where clause"/søgekriterier.

Wisen
Jeg skal ha følgende struktur:
<write>
  <field>feltnavn</field>
  <value>timestamp</value>
</write>
og der skal kunne skrives flere gange.

Og min kode ser ud som:
//Find startelement
XmlDocument xdoc = new XmlDocument();

//load fil
xdoc.Load(path+"\\xmlWrite.xml"); //path defineret længere oppe i scopet.

//Create element field
XmlElement elem = xdoc.CreateElement("field");
XmlText text = xdoc.CreateTextNode(fielddata); //feltnavn

//Indsæt element før sluttag
xdoc.DocumentElement.AppendChild(elem);
xdoc.DocumentElement.LastChild.AppendChild(text);

//Create element value
elem = xdoc.CreateElement("value");
text = xdoc.CreateTextNode(valuedata); //timestamp

//Indsæt element før sluttag
xdoc.DocumentElement.AppendChild(elem);
xdoc.DocumentElement.LastChild.AppendChild(text);

1. Vil denne kode indsætte field og value med tilhørende data i ovenstående rækkefølge og som det sidste i dokumentet?
2. Hvis jeg udfører denne metode 2 gange efter hinanden vil den så generere xml der ser således ud? :

<write>
  <field>feltnavn</field>
  <value>timestamp</value>
  <field>feltnavn</field>
  <value>timestamp</value>
</write>
Avatar billede wisen Nybegynder
08. februar 2008 - 14:03 #8
Når du bare skal sætte noget tekst ind i et XmlElement, kan du bare bruge InnerText..

XmlElement elem = xdoc.CreateElement("field");
elem.InnerText = fieldData;
xdoc.DocumentElement.AppendChild( elem );

1. Ja - AppendChild sætter altid ind sidst i det element du kalder på.. i dette tilfælde rod-elementet.

2. Ja - givet at du allerede har <write> elemetet (rod-elementet)
Avatar billede wmann Nybegynder
08. februar 2008 - 14:45 #9
Jeg tjekker om filen er oprettet eller om jeg skal oprette den.
For hvis jeg kan få en reader til at læse stien og læse fra den findes den, og dermed skal jeg indsætte i den.

Ellers skal den oprettes og skrives til fra ny, hvor jeg opretter <write> elementet i samme procedure.
Så på denne måde kan jeg sikre mig at når jeg skal skrive til den i ovenstående kode som jeg havde i forrige indlæg, der findes filen og dermed findes <write> elementet allerede også.

Nu jeg så bare kommet i tanke om en temmeligt meget mere besværlig ting jeg havde glemt. Sagen er at når et program arbejder på en tabel kan man ikke oprette en kolonne/felt.
Jeg skal give et tidsstempel i en kolonne/felt hver gang at noget ændres, hvilket jeg fanger med en OnChange-event. Og så skriver jeg de ændringer der skal tilføjes til min xml-fil.
OnClose vil jeg så oprette kolonnen/feltet fordi så programmet ved at lukke ned og har derved lukket sin lock op på tabellen. Men når jeg ikke skriver til tabellen ved OnChange-eventen så får jeg ikke den række med som parameter der ændres. Og dermed skal jeg pludselig selv finde databasen og tabellen og så rækken der skulle ændres.
Jeg skal så oprette kolonnen/feltet og skrive dataene til den for hver to tags jeg får <field> og <value>.
Men det tror jeg ikke i kan hjælpe mig med umiddelbart for det ikke noget SÅ forfærdeligt mange roder med dette program, OG så var det heller ikke det jeg oprettede denne tråd til. I har besvaret mine spørgsmål og skal i ha jeres point for, selvom jeg først kan teste om det virker om laang tid.. :P

men noget helt andet er.. Hvordan giver jeg så de her point?
Avatar billede wisen Nybegynder
08. februar 2008 - 14:54 #10
... først er der nogen der skal ligge et svar - det kan også være dig selv.. derefter skal du vælge hvilke svar der skal have point, og hvor mange de hver især skal have... derefter skal du trykke på acceptér.
Avatar billede wisen Nybegynder
08. februar 2008 - 14:54 #11
... 1 stk. 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