Avatar billede dadane Novice
01. juli 2004 - 08:24 Der er 7 kommentarer og
1 løsning

XML tjek

Jeg har brug for en XML tjekker som:

1) Fortæller hvilke fejl der er (det er meget væsentligt, jeg forventer at få udtryk som

</adresse>
<adresse>
<gade>Gedhøjen</gade>
<nummer>17</nummer>

Og selvom det ligner så duer det jo ihvert fald ikke!)

2) Fjerner uønskede tags.

Er der nogen der ligger inde med noget eller måske har et link?
Avatar billede jakobdo Ekspert
01. juli 2004 - 11:24 #1
Avatar billede coderdk Praktikant
01. juli 2004 - 18:44 #2
xmllint
Avatar billede dadane Novice
01. juli 2004 - 19:44 #3
Jeg ved ikke lige hvad der er sket. Det var ikke meningen at der kun skulle være 0 point her. (Jeg vil gerne sætte 100 point på højkant hvis nogen kan hjælpe mig. Jeg kan oprette et nyt sp. hvis det bliver nødvendigt).

xmlint lyder som et godt værktøj, - men jeg tvivler på at jeg kan få det installeret på serveren.

Mht. xml-parser-create, så lyder det lidt som noget i den rigtige retning, - men fejlmeldingen er lidt skidt. Den siger blot: not well-formed (invalid token), og det er ikke helt godt nok.
Avatar billede dadane Novice
01. juli 2004 - 19:46 #4
Min kode er:

$simple = "</adresse>
<adresse>
<gade>Gedhøjen</gade>
<nummer>17</nummer>";
$p = xml_parser_create();
if (!xml_parse_into_struct($p, $simple, $vals, $index)) die (xml_error_string(xml_get_error_code($p)));
Avatar billede dadane Novice
01. juli 2004 - 22:37 #5
Tillader mig at svare selv.
Nedenstående ser ud til at virke. Kommentarer (hints til hvad der evt. kan gå galt) modtages med tak.

<?php

function error ($tekst) {
    $tekst = str_replace("<","&lt;",$tekst);
    $tekst = str_replace(">","&gt;",$tekst);
    die ($tekst);
}

$simple = "<adresse><gade><x id=\"3\" />Gedhøjen</gade><nummer>17</nummer></adresse>";

$test = $simple;

$pos=0;
$sp=0;
while ($test!="") {
    $lt=strpos($test,"<");
    $spa=strpos($test," ");
    $gt=strpos($test,">");
    if ($gt<$lt) error ("Uventet > i position: " . ($pos+$gt));

    if ($lt!=0 && $sp==0) error ("Teksten " . substr($test,0,$lt) . " er ikke i et tag!");
   
    $var = substr($test,$lt,$gt-$lt+1); // $var indeholder hele tagget, altså f.eks. <test id="3" size="7">
    $allvar=$var;        // $allvar indeholder hele tagget, - dette bruges til at detektere selvafsluttende tags, - altså f.eks. <test/>
    if (strpos($var," ")) { // Hvis der er mellemrum i er der forskel på hele tagget og tagnavnet. (test i det ovenstående eksempel)
        $var = substr($test,$lt,$spa-$lt+1);
    }
    if (strpos($var,"/")==1) {
        $var=str_replace("/","",$var);
        if ($sp>0) {
            if ($stack[--$sp]!=$var) error ($stack[$sp] . " afslutning forventet, men fik en " . $var . "\n" . $test . "-" . $sp);
        } else {
            error ($var . " afsluttet før den blev startet!");
        }
    } else {
        if ((substr($allvar,strlen($allvar)-2,1))!="/") { // <test id="7"/> skal på stakken, - men straks af igen, så vi sparer besværet ;)
            $stack[$sp++] = $var;
        }
    }
   
    $pos.=$gt+1;
    $test=substr($test,$gt+1);
   
}
if ($sp!=0) error($sp . " uafsluttede tags " . $stack[$sp-1]);
echo "Strengen er en valid XML streng";
?>
Avatar billede dadane Novice
01. juli 2004 - 22:44 #6
Der burde nok lige et enkelt tjek mere med, - nemlig:

    if ($lt === false) error ($test . " er ikke i et tag");
Avatar billede dadane Novice
01. juli 2004 - 22:46 #7
Endeligt tror jeg nok at et rigtigt XML udtryk kun har en rod (altså f.eks. <html>). Hvis det er vigtigt for aplikationen er det nemt at skrive ind.

Der hvor jeg skal bruge det skal det ikke bruges.
Avatar billede dadane Novice
03. juli 2004 - 12:19 #8
Det giver så kun første del af det jeg ønskede. Men anden del er så ret triviel at få med ind.
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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