Betyder det at data kan betragtes som en lang streng og at opgaven derfor er at laese en fil og gemme den streng i DB + laese en streng fra DB og gemm som fil ?
Det er ret nemt at loebe alle elementer i en XML fil igennem, men har du ikke en kendt tabel struktur som matcher - hvad vil du saa bruge info til ?
Eller er det et mix med en kendt del og en ukendt del ?
Svaret må være "en kendt del og en ukendt del".. tror jeg..
Jeg kender navnene på tabellen og kolonnerne, men ved ikke hvad felterne i kolonnerne indeholder.
Brugeren kan selv skrive ting til databasen (backend til et website), og jeg har derfor ingen anelse om hvad felterne kan indeholde. Indholdet er ikke begrænset til en enkelt streng, men kan være en tekst der indeholder al HTML, f.eks. HTML tabeller (<table...>) osv..
Jeg kom i tanke om XML, da dataene skal benyttes af 2 forskellige systemer. Outputtet fra databasen skal indsættes i en eller anden standard form, som nemt redigeres og indlæses igen. Grunden til det er, at indeholdet af databasen sendes til en ekstern virksomhed, som oversætter indholdet til forskellige sprog. Indholdet (der er blevet oversat) skal derefter indsættes i databasen igen.
Ja, det var også det jeg var igang med.. Jeg har fundet en del eksempler med ASP og XML, men jeg kan ikke få dem til at virke med iterering af XML noderne..
<% Set xmldoc = CreateObject("Msxml.DOMDocument") xmldoc.Async = false xmldoc.Load("filnavn") Set nodes = xmldoc.SelectNodes("//*") For Each node In nodes ...
Det ser ikke ud til at virke.. følgende udskriver intet (kun "<hr>" og dato+tid):
ASP:
<% Option Explicit
Dim xmldoc, node, nodes
Set xmldoc = CreateObject("Msxml.DOMDocument") xmldoc.Async = false xmldoc.Load(server.mappath("text.xml")) Set nodes = xmldoc.SelectNodes("//*") For Each node In nodes response.write node Next
Jeg er næsten sikker på, at det er ".SelectNodes" der fejler.. og med ".SelectNode" får jeg fejlen:
Fejltype: Der opstod en Microsoft VBScript-kørselsfejl (0x800A01B6) Objektet understøtter ikke denne egenskab eller metode: 'SelectNode' /s/aspxml/index.asp, line 9
Jeg er kommet frem til noget kode, der ser ud til at virke..
ASP:
<% Option Explicit
Dim xmldoc, node, nodes
Set xmldoc = CreateObject("Msxml.DOMDocument") xmldoc.Async = false xmldoc.Load(server.mappath("test.xml"))
Set nodes = xmldoc.SelectNodes("//personer//person") For Each node In nodes response.write node.childNodes(0).text & "," response.write node.childNodes(1).text & "," response.write node.childNodes(2).text & "," response.write node.childNodes(3).text response.write "<br>" Next Set nodes = Nothing
Jeg skal jo have dataene enkapslet på en eller anden måde, så jeg med sikkerhed kan hive dem ud igen..
Man kunne bruge nogle delimeters, og splitte indholdet op..
Eksempel:
----------IdPåPosten overskrift eller titel ----- selve teksten ----------IdPåPosten
osv..
Så kunne man splitte ved 10x "-" tegn, hvilket opdeler hele poster til en array Så ved man, at det der står fra tegn 0 og til linieskiftet, er Id'et på posten. Derefter er det overskriften/titlen, indtil man støder på 5x "-" tegn
Osv..
Jeg vil dog mene, at XML metoden er mere pålidelig, da kunden muligvis kunne finde på at indsætte "-----" som en seperator mellem tekster..
Any thoughts?
Hvordan ville du takle opgaven, hvis du var i den situation..? :-)
XML til data er helt sikkert bedre end ----------.
Jeg spekulerer bare på om du kunne opdele data og HTML, således at du havde data i XML og HTML for sig - evt. tilføjede HTML via en XSLT processing af XML'en.
Jeg har aldrig kigget på XSLT.. så det må jeg gøre..
Sig endeligt til, hvis XSLT kan løse nedenstående problem..
Hvis jeg skulle opdele indholdet i data og HTML, skulle det gøres når jeg hiver dataene (extract script) ud af databasen, for at genererer filen der skal sendes til virksomheden.
Forstil dig at indholdet kan indeholde alle HTML elementer, som f.eks. P, TABLE, SPAN, DIV, osv..
Jeg er i tvivl om hvordan det skulle gøres?
Mens jeg skriver dette indlæg, kommer jeg i tanke om noget..
Man kunne måske få extract scriptet til at bruge RegEx til at extracte selv teksten ud af HTML koden (for hver post), og putte den opdelte tekst op i XML tags..
Eksempel:
<postid value="23"> <before>Velkommen</before> <before>Kontakt os på følgende email adresse</before> </postid> <postid value="44"> <before>Hej Verden</before> </postid>
Når virksomheden så har oversat teksterne, sendes følgende retur:
<postid value="23"> <before>Velkommen</before> <after>Welcome</after> <before>Kontakt os på følgende email adresse</before> <after>Contact us at the following email adress</after> </postid> <postid value="44"> <before>Hej Verden</before> <after>Hello World</after> </postid>
Men så skal jeg vel bruge en eller anden måde at kunne "tagge" teksterne, så jeg kan få et script til at lave Search And Replace, så BEFORE-teksterne bliver erstattet af AFTER-teksterne.. Ellers kan man løbe ind i problemer, hvis visse ord skifter form i forskellige sprog, alt efter om ordene står alene eller i en sætning..
Simpelt eksempel (HTML-koden kan sagtens være meget mere kompleks):
Before: <h1>Velkommen</h1>
Pseudokode til XML (/XSLT?) <h1><værdi tilhørende POSTID=23, TEXTID=14></h1>
AFTER / resultat: <h1>Welcome</h1>
Nogen idéer?
HMM.. jo mere jeg skriver i indlægget, jo større område jeg dækker, og jo flere idéer jeg støder på.. :-)
Hvad nu hvis TEXTID-værdien faktisk var index'et på det elementet i "array" som RegEx returnerer?
Eksempel: Hvis man matcher alt mellem "<h1>" og "</h1>", og der er flere H1-tags i HTML-koden, vil RegEx vel returnerer en array.. TEXTID kunne så refererer til index'et i denne array.. I foregående eksempel ("Simpelt eksempel..."), vil TEXTID skulle have værdien 0, da "Velkommen" står som det første element i RegEx arrayen, hvis RegEx arrayen er zero-based (/starter ved 0 og ikke 1)..
Da jeg ikke har haft den store succes med RegEx, kan jeg ikke helt gennemskue om dette er en brugbar løsning..
Jeg har stadig ikke forstået din problem stilling. Men her et lidt XSLT til inspiration.
Prøv og kig på lang.xml i en browser:
lang.xml:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="lang.xsl"?> <phrases> <phrase id="1"> <lang id="dk">Velkommen</lang> <lang id="uk">Welcome</lang> </phrase> <phrase id="2"> <lang id="dk">Kontakt os på følgende email adresse</lang> <lang id="uk">Please contact us at the following email address</lang> </phrase> </phrases>
Hmm.. 21/03-2008 02:05:19 forudsætter at man allerede har delt indholdet op..
Eksempel på indhold af felt i databasen (der kan også være tabeller og andet snask):
<br>Hej</b> <i>Verden</i>
Det der så skal sendes ud til virksomheden, er "Hej" og "Verden", uden HTML (<b></b> og <i></i>), via en XML fil, derfor strukturen i 20/03-2008 12:44:25.
Jeg kan på ingen måde styre/bestemme det der kommer til at stå i felterne.. Så det jeg skal bruge, er vel nok regular expression til at hive teksten ud af HTML, og oprette en eller anden form for nummereringssystem, så jeg kan generere XML koden (for at sende XML'en til virksomheden), og derefter aflæse XML'en og putte den nye tekst (f.eks. engelsk) de rigtige steder i HTML'en.
Kunden (der har lavet indholdet) skal også kunne redigere i teksten bagefter, uden besvær..
Du parser alt udenfor tags ud ved hjælp af regex, du gemmer teksterne i en map data struktur så du er sikker på kun at få dem med engang, bagefter itererer du over dem og udskriver XML med nummerering.
Når XML kommer tilbage, så parses den og fra og til gemmes i en map data struktur, så parses data igen - tags hives over uændret - alt udenfor tags slåes op i map og oversættes.
Jeg har kigget på RegEx via http://www.regular-expressions.info/ , men hver gang jeg tror at jeg har forstået det, fejler mine test-patterns, og jeg fatter det bare ikke.. de virker bare ikke..
<% html = "<br>Hej</b> <i>Verden</i>" Set reo = New RegExp reo.Pattern = "(^|>)([^<]+)(<|$)" reo.Global = True Set mm = reo.Execute(html) For Each m in mm Response.Write "Found: " & m.SubMatches(1) & "<BR>" Next Set reo = Nothing %>
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.