Avatar billede thesurfer Nybegynder
17. marts 2008 - 21:56 Der er 27 kommentarer og
1 løsning

Generering og aflæsning af XML via ASP, indeholder HTML

Jeg skal bruge eksempler på:

1) Gennemløb af XML fil (vilkårlig antal noder), og aflæsning af noderne (både navn og værdi) via ASP i IIS (6) på XP og 2003.

2) Generering af XML kode via ASP.


Det skal bruges til output fra en database (CMS), hvor værdierne kan indeholde HTML kode.. til en XML fil, og tilbage igen.


Altså:

* Værdierne (som kan indeholde HTML) eksporteres fra databasen og til en XML fil, via ASP.

* Værdierne (som kan indeholde HTML) skal kunne importeres fra en XML fil og til databasen, via ASP.

* Værdierne er vilkårlige og derfor ukendte


Hvis I har bedre forslag, hører jeg også gerne fra jer.
Avatar billede arne_v Ekspert
17. marts 2008 - 22:02 #1
Vilkaarlige ?

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 ?
Avatar billede thesurfer Nybegynder
17. marts 2008 - 22:08 #2
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.
Avatar billede arne_v Ekspert
17. marts 2008 - 22:11 #3
OK. Kendte felter.

DB->XML:

laes en raekke
skriv fil med <felnavn>feltindhold</feltnavn> for hvert felt

XML->DB:

laes XML fil ind i DOM dokument
iterer over alle elementer og indsaet hvert elements vaerdi i det tilsvarende database felt

?
Avatar billede thesurfer Nybegynder
17. marts 2008 - 22:12 #4
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..

Det er derfor jeg søger eksempler (kode).. :-)
Avatar billede arne_v Ekspert
17. marts 2008 - 22:13 #5
DB->XML maa vaere nem.

XML->DB maa kunne bruge:

<%
Set xmldoc = CreateObject("Msxml.DOMDocument")
xmldoc.Async = false
xmldoc.Load("filnavn")
Set nodes = xmldoc.SelectNodes("//*")
For Each node In nodes
...
Avatar billede thesurfer Nybegynder
17. marts 2008 - 22:21 #6
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

response.write "<hr>done, " & now
%>


XML i test.xml:

<?xml version="1.0"?>
<person>
  <navn>Hans Hansen</navn>
  <adresse>Hansensvej 123</adresse>
  <postnr>1234</postnr>
  <bynavn>Hansensby</bynavn>
</person>


Jeg kan se at du har skrevet XML-relatererede artikler i næsten samtlige sprog, pånær ASP.. :-)


PS:
Jeg bruger denne linie for at se om der overhovedet sker ændringer:
response.write "<hr>done, " & now
Avatar billede thesurfer Nybegynder
17. marts 2008 - 22:22 #7
Hmm.. lagde mærke til at jeg skrev "text.xml" i stedet for "test.xml".. da jeg rette stavefejlen, fik jeg denne fejlmelding:

Fejltype:
Response-objekt, ASP 0185 (0x80020003)
En standardegenskab for objektet blev ikke fundet.
/s/aspxml/index.asp

Der står ikke linienummer..
Avatar billede thesurfer Nybegynder
17. marts 2008 - 22:34 #8
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

line 9: Set nodes = xmldoc.SelectNode("//*")
Avatar billede thesurfer Nybegynder
17. marts 2008 - 22:42 #9
Jeg har nu ændret XML filen til:

<?xml version="1.0"?>
<person>
  <navn>Jens Hansen</navn>
  <adresse>Olsensvej 123</adresse>
  <postnr>7890</postnr>
  <bynavn>Kurtsby</bynavn>
</person>


Jeg bruger nu følgende kode:

<%
Option Explicit

Dim xmldoc, node, nodes

Set xmldoc = CreateObject("Msxml.DOMDocument")
xmldoc.Async = false
xmldoc.Load(server.mappath("test.xml"))

Set nodes = xmldoc.SelectNodes("//*")
For Each node In nodes
    response.write node.text & ","
Next
Set nodes = Nothing

Set xmldoc = nothing

response.write "<hr>done, " & now
%>

Og får følgende output:

Jens Hansen Olsensvej 123 7890 Kurtsby,Jens Hansen,Olsensvej 123,7890,Kurtsby,


Jeg forstår ikke helt komma-placeringen.. andet end at "node" indeholder alle noderne for den pågældende entry/post..
Avatar billede thesurfer Nybegynder
17. marts 2008 - 22:52 #10
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

Set xmldoc = nothing

response.write "<hr>done, " & now
%>


XML:


<?xml version="1.0"?>
<personer>
    <person>
      <navn>Jens Jensen</navn>
      <adresse>Jensensvej 123</adresse>
      <postnr>7890</postnr>
      <bynavn>Jensensby</bynavn>
    </person>
    <person>
      <navn>Hans Hansen</navn>
      <adresse>Hansenssvej 123</adresse>
      <postnr>7890</postnr>
      <bynavn>Hansensby</bynavn>
    </person>
</personer>
Avatar billede thesurfer Nybegynder
17. marts 2008 - 22:56 #11
Hmm.. er der nogen "get"-metode på noden..? Så man f.eks. kan bruge:

node.Navn
node.Adresse
node.Postnr
node.Bynavn

eller ligende..?
Avatar billede thesurfer Nybegynder
17. marts 2008 - 23:10 #12
Det ser ud til at virke fint med linieskift i tagsne..

Eksempel:

<navn>Jens
Jensen</navn>

Man kan også have HTML tags i teksten, men:

1) Alle startede tags *skal* lukkes igen, ellers virker det ikke (= indholdet bliver ikke udskrevet)

2) Alle HTML tags forsvinder, når de indholdet udskrives..
Avatar billede thesurfer Nybegynder
19. marts 2008 - 11:32 #13
Hmm.. man kan vist bruger CDATA:

http://www.w3schools.com/xml/xml_cdata.asp
(ikke det bedste site at linke til, men muligvis hvad jeg har brug for)

Er det noget du kan bekræfte..?
Avatar billede arne_v Ekspert
19. marts 2008 - 17:58 #14
Jeg kom lidt vaek fra dette spoergsmaal.

Du kan selecte et bestemt underelement til et element med SelectSingleNode.

Ja - CDATA boer loese det problem. Men jeg er ikke sikker paa at det er optimalt at
blande XML data og HTML tags.
Avatar billede thesurfer Nybegynder
19. marts 2008 - 20:09 #15
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..? :-)
Avatar billede arne_v Ekspert
20. marts 2008 - 04:15 #16
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.
Avatar billede thesurfer Nybegynder
20. marts 2008 - 12:44 #17
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..


Nogen anelse om denne idé kan bruges?
Avatar billede arne_v Ekspert
21. marts 2008 - 02:05 #18
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>

lang.xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
<head>
<title>SuperBusiness</title>
</head>
<body>
<h1><xsl:value-of select="//phrases/phrase[@id='1']/lang[@id='dk']"/></h1>
<xsl:value-of select="//phrases/phrase[@id='2']/lang[@id='dk']"/>:<a href="mailto:sale@superbusiness.dk">sale@superbusiness.dk</a>.
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Avatar billede arne_v Ekspert
21. marts 2008 - 02:14 #19
Og transformering i ASP:

<%
Response.ContentType = "text/html"
Response.AddHeader "Content-Type", "text/html;charset=UTF-8"
Response.CodePage = 65001
Response.CharSet = "UTF-8"
Set xmldoc = CreateObject("Msxml.DOMDocument")
xmldoc.Async = false
xmldoc.Load(Server.MapPath("lang.xml"))
Set xsldoc = CreateObject("Msxml.DOMDocument")
xsldoc.Async = false
xsldoc.Load(Server.MapPath("lang.xsl"))
Response.Write xmldoc.TransformNode(xsldoc)
%>
Avatar billede arne_v Ekspert
21. marts 2008 - 02:15 #20
Ideen er at skille:
- oversættelser (XML fil)
- HTML template (XSL fil)

Og jeg ved ikke om det lige passer til dit brug.

Men det er da værd at bruge 5 minutter på at vurdere.
Avatar billede thesurfer Nybegynder
21. marts 2008 - 11:21 #21
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..


Gav det mening?
Avatar billede arne_v Ekspert
23. marts 2008 - 00:27 #22
Hm.

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.
Avatar billede thesurfer Nybegynder
06. april 2008 - 21:07 #23
Jeg kan se at du gav følgende RegEx-løsning, på at fjerne alle HTML tags, i http://www.eksperten.dk/spm/824635 :

html = Regex.Replace(html, "<[^>]*>","");

Det er næsten det modsatte, af det jeg vil/skal..

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..


Kan jeg får dig til at lave det korrekte pattern?
Avatar billede arne_v Ekspert
07. april 2008 - 04:20 #24
Du skal vel bruge noget a la:

<%
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
%>

for at finde alle teksterne.
Avatar billede arne_v Ekspert
08. juni 2008 - 17:46 #25
kommet videre ?
Avatar billede thesurfer Nybegynder
09. juni 2008 - 19:04 #26
Beklager at jeg først skrive nu.. har haft lidt travlt.

Jeg er ikke kommet videre.


Jeg har prøvet på at få et script til at virke som beskrevet i 20/03-2008 12:44:25.

Men det jeg ikke helt kan se, er hvordan jeg tager resultatet af overstættelsen og arbejder med det..?
Avatar billede thesurfer Nybegynder
07. oktober 2010 - 19:27 #27
arne_v: Spørgsmålet er ikke længere relevant, men du skal have tak for din indsats.

- Læg venligst et svar, så du kan få points.
Avatar billede arne_v Ekspert
07. oktober 2010 - 19:49 #28
ok
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
Kurser inden for grundlæggende programmering

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