Toon posts:

[XML] XML Parsing Error: undefined entity

Pagina: 1
Acties:
  • 347 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben bezig met een basiscursus xml. Nu werken de oefeningen maar half. Met mijn kennis van xml biedt w3c niet echt veel uitkomst, ik snap er geen snars van.

Het gaat om het volgende ik heb een dtd gemaakt en dmv. xsl wil ik een xml bestand opmaken. Er bestaat externe entiteiten in het xml-bestand. IE6 geeft entiteiten niet weer, Firefox loopt te melken over undefined entity en Opera loopt over xslt te melken. Ik zie geen verschil met het boek heb eea. al geprobeerd ik heb volgens mij entitiet goed gedeclareerd in dtd.

Volgende code;

xml
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<?xml-stylesheet  type="text/xsl" href="./adressen2.xsl"?>
<!DOCTYPE klanten SYSTEM "./klanten.dtd">
<klanten>
    <bedrijf class="geenkleur">
                <nummer>14112</nummer>
                <naam>Daring</naam>
                <adres>Kerkplein 8</adres>
                <pc>3741 KP</pc>
                <plaats>Baarn</plaats>
                <tel>0355 121212</tel>
                <fax>0355 212121</fax>
                <email>info@daring.nl</email>
                <web>www.daring.nl</web>
                <contact>
                        <vnaam>Magda</vnaam>
                        <anaam> de Boer</anaam>
                        <tel>0355 121234</tel>
                        <email>mdeboer@daring.nl</email>
                        &brief1;
                        &brief2;
                </contact>
        </bedrijf>
</klanten>


DTD
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!ELEMENT klanten (bedrijf+)>
<!ELEMENT bedrijf (nummer, naam ,adres, pc, plaats, tel?, fax?, email, web?, contact*)>
        <!ELEMENT nummer (#PCDATA)> 
        <!ELEMENT naam (#PCDATA)>
        <!ELEMENT adres (#PCDATA)>
        <!ELEMENT pc (#PCDATA)>
        <!ELEMENT plaats (#PCDATA)>
        <!ELEMENT tel (#PCDATA)> <!-- tevens declaratie voor nested element in contact -->
        <!ELEMENT fax (#PCDATA)>
        <!ELEMENT email (#PCDATA)> <!-- tevens declaratie voor nested element in contact -->
        <!ELEMENT web (#PCDATA)>
        <!ELEMENT contact (vnaam, anaam, tel, email, brief?)>
                <!ELEMENT vnaam (#PCDATA)>
                <!ELEMENT anaam (#PCDATA)>
                <!ELEMENT brief (aan,  betreft,  inhoud)> <!-- eniteit  "briefX.xml"-->
                        <!ELEMENT aan (#PCDATA)>
                        <!ELEMENT betreft (#PCDATA)>
                        <!ELEMENT inhoud (#PCDATA)>   

<!-- atributen -->

<!ATTLIST bedrijf class (kleur|geenkleur) "geenkleur">         

<!-- entiteiten -->

<!ENTITY brief1 SYSTEM "./brief1.xml">
<!ENTITY brief2 SYSTEM  "./brief2.xml">


entiteit
XML:
1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
<brief>
        <aan>Daring</aan>
        <betreft>Boek XML</betreft>
        <inhoud>dit is de tekst van de brief</inhoud>
</brief>


Misschien begrijp ik ihet niet, of het boek is fout (zal niet de eerste keer zijn).

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Browsers zijn over het algemeen geen validating parsers.

Intentionally left blank


Verwijderd

Topicstarter
uhmmm..., ik begrijp het niet helemaal. Het gaat hier niet om valideren van de code. De code werkt uberhaupt niet. in IE6 worden er geen entitieten via xsl getoond. Rechtstreeks xml geeft alleen entiteiten weer en weer niet de andere elementen 8)7 Bij Firefox en Opera krijg ik parsing errors. :X

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op vrijdag 03 november 2006 @ 22:34:
uhmmm..., ik begrijp het niet helemaal. Het gaat hier niet om valideren van de code. De code werkt uberhaupt niet. in IE6 worden er geen entitieten via xsl getoond. Rechtstreeks xml geeft alleen entiteiten weer en weer niet de andere elementen 8)7 Bij Firefox en Opera krijg ik parsing errors. :X
Dat bedoel ik ook te zeggen: browsers lezen geen DTD's. Gebruik dus een echte XML-parser hiervoor.

Intentionally left blank


Verwijderd

Topicstarter
Ik krijg het niet voor elkaar! Ik probeer het nu met XMLspy (zit XML-parser in), maar de entiteiten worden nog steeds als tekens doorgezet -> namelijk &brief;. Ze zijn niet te zien in XMLspy browsertab. het externe xml-bestand wordt niet ingevoegd. De xsl, DTD en xml-bestanden worden gevalideerd of zijn well-formed (externe entiteiten zonder DTD). Schiet mij maar lek.

Zou iemand mij gericht advies kunnen geven? Je hoeft het niet voor te kauwen, maar het zal voor een beginner te begrijpen moeten zijn. Als het ook niet met XMLspy-parser werkt welke moet ik dan gebruiken en hoe?
offtopic:
Waar is de reply button geleven? ik heb nu quotebutton gebruikt en de quote weggehaald! Er zit geen slot op deze topic.

[ Voor 4% gewijzigd door Verwijderd op 05-11-2006 09:35 ]


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op zondag 05 november 2006 @ 09:31:
Ik krijg het niet voor elkaar! Ik probeer het nu met XMLspy (zit XML-parser in), maar de entiteiten worden nog steeds als tekens doorgezet -> namelijk &brief;. Ze zijn niet te zien in XMLspy browsertab. het externe xml-bestand wordt niet ingevoegd. De xsl, DTD en xml-bestanden worden gevalideerd of zijn well-formed (externe entiteiten zonder DTD). Schiet mij maar lek.

Zou iemand mij gericht advies kunnen geven? Je hoeft het niet voor te kauwen, maar het zal voor een beginner te begrijpen moeten zijn. Als het ook niet met XMLspy-parser werkt welke moet ik dan gebruiken en hoe?
Ik ken XMLspy verder niet dus kan ook niet zeggen of dat een validating parser is of niet. In ieder geval heb ik even een relevant stukje uit de specificatie opgesnort voor je:
When an XML processor recognizes a reference to a parsed entity, in order to validate the document, the processor MUST include its replacement text. If the entity is external, and the processor is not attempting to validate the XML document, the processor MAY, but need not, include the entity's replacement text. If a non-validating processor does not include the replacement text, it MUST inform the application that it recognized, but did not read, the entity.

This rule is based on the recognition that the automatic inclusion provided by the SGML and XML entity mechanism, primarily designed to support modularity in authoring, is not necessarily appropriate for other applications, in particular document browsing. Browsers, for example, when encountering an external parsed entity reference, might choose to provide a visual indication of the entity's presence and retrieve it for display only on demand.
note dat non-validating parsers dit wel ondersteunen (internal entities):
XML:
1
2
3
4
5
6
7
<?xml version="1.0"?>
<!DOCTYPE test [
    <!ENTITY duck "Donald Duck">
] >
<test>
    &duck;
</test>
offtopic:
Waar is de reply button geleven? ik heb nu quotebutton gebruikt en de quote weggehaald! Er zit geen slot op deze topic.
Rechtsboven en rechtsonder :?

[ Voor 4% gewijzigd door crisp op 05-11-2006 14:06 ]

Intentionally left blank


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Ik ben nog even wat verder gaan testen. Je zou in ieder geval nooit een undefined entity error mogen krijgen door de standalone="no" (tevens assumed als je hem weglaat - je verwijst immers naar een externe DTD); non-validating parsers moeten dan aannemen dat de entity is gedefinieerd in de externe DTD ook al wordt die niet gelezen (en kan de entity dus niet worden omgezet).
Ik heb de xml-stylesheet in mijn test even weggelaten en dan blijkt het volgende:
IE6 parsed het document correct inclusief de entity
Firefox geeft onterecht een error 'undefined entity' (bug dus)
Opera rendered de XML ook maar laat de entity letterlijk staan (non-validating)

Alleen IE lijkt hier dus wel DTD validatie te doen en parsed dus externe entities (pas op voor caching in IE), Firefox en Opera hebben geen validating parsers.

Dit voorkomt de entity-error in Firefox, enkel wordt de entity dan (uiteraard) nog steeds niet geparsed. Firefox laat de entity echter ook niet zien (je krijgt een lege textnode - dat is in feite een andere maar related bug):
XML:
1
2
3
4
5
6
<!DOCTYPE klanten SYSTEM "klanten.dtd"
[
    <!ENTITY brief1 SYSTEM "./brief1.xml">
    <!ENTITY brief2 SYSTEM "./brief2.xml">
]
>

[ Voor 30% gewijzigd door crisp op 05-11-2006 14:21 ]

Intentionally left blank


Verwijderd

Topicstarter
Ik ben er achter dat de externe entiteiten met externe DTD netjes worden geparsed in IE6. Alleen wordt er geen waarde via xsl van het betreffende element uit de entiteit getoond. Xml-code staat bovenaan deze topic.

Stuk xsl;

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
                    </tr>
                    <xsl:apply-templates select="klanten/bedrijf"/>
                </table>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="klanten/bedrijf">
        <tr>
            <td>
                <xsl:value-of select="naam"/>
            </td>
            <td>
                <xsl:value-of select="plaats"/>
            </td>
            <td>
                <xsl:value-of select="email"/>
            </td>
                        <!--<td>
                                <xsl:value-of select="contact/brief/betreft"/> 
                                //alleen op deze manier gaat het goed als ook de 2de template is ge'outcomment.
                        </td> -->
            <td>
                <xsl:apply-templates match="contact/brief"/> <!-- hier gaat het om. brief is een externe entity-->
            </td>
        </tr>
    </xsl:template>
    <xsl:template match="contact/brief">  <!-- hier gaat het om -->
        <xsl:value-of select="betreft"/>
        <br/> 
    </xsl:template>
</xsl:stylesheet>

Verwijderd

crisp schreef op zondag 05 november 2006 @ 12:54:
Ik ken XMLspy verder niet dus kan ook niet zeggen of dat een validating parser is of niet.
XMLSpy heeft een prima validating parser, en is m.i. de beste XML editor/tool die ik ooit ben tegengekomen. Helaas wel Windows only, maar absoluut z'n geld waard!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op zondag 05 november 2006 @ 22:14:
Ik ben er achter dat de externe entiteiten met externe DTD netjes worden geparsed in IE6. Alleen wordt er geen waarde via xsl van het betreffende element uit de entiteit getoond. Xml-code staat bovenaan deze topic.
Ik ben zeker geen expert op het gebied van XSL maar als ik het zo bekijk lijkt me dat dan weer een beperking of bug van IE's implementatie. Sowieso is het niet verstandig om transformaties aan een (onbekende) client over te laten, zeker niet als toegankelijkheid gewenst is (beetje het IKEA verhaal*). Je ziet zelf al dat ondersteuning voor bepaalde zaken binnen browsers nogal te wensen over laat en behoorlijk verschilt van browser tot browser.

Als je uiteindelijke doel is om een view te genereren voor een browser dan zou ik zeker eens kijken naar serverside transformatie en gewoon (X)HTML naar de client sturen. Je gebruikt dan een XML-parser waarvan bekent is wat deze wel en niet ondersteund.

* Het IKEA voorbeeld heb ik al eens eerder aangehaald: je geeft je klant een pakket met bouwmaterialen mee en een beschrijving hoe het in elkaar gezet moet worden maar het uiteindelijke resultaat is compleet afhankelijk van de handigheid van de klant ;)

Intentionally left blank


Verwijderd

Topicstarter
Whahhhh..... Is het nu echt niet mogelijk om fatsoenlijke pagina's met xml en xsl op mijn desktop te tonen zonder server-sided script ervoor te schrijven.

Ik dacht ga uitzoeken hoe ik dmv. xsl-module voor php via apache html kan laten uitpoepen, maar dat gaat ik niet 123... (correct me if i'm wrong). Ik kan php nog niet goed genoeg omdat voor elkaar te krijgen.

Hoe kan je als beginner XML icm. DTD, XSL, namespace en de hele mikmak makkelijk op je desktop draaien? Dwz. testen, valideren en in browserwindow.

  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 27-06 13:00
Verwijderd schreef op zondag 05 november 2006 @ 09:31:
Ik krijg het niet voor elkaar! Ik probeer het nu met XMLspy (zit XML-parser in), maar de entiteiten worden nog steeds als tekens doorgezet -> namelijk &brief;. Ze zijn niet te zien in XMLspy browsertab. het externe xml-bestand wordt niet ingevoegd. De xsl, DTD en xml-bestanden worden gevalideerd of zijn well-formed (externe entiteiten zonder DTD). Schiet mij maar lek.

Zou iemand mij gericht advies kunnen geven? Je hoeft het niet voor te kauwen, maar het zal voor een beginner te begrijpen moeten zijn. Als het ook niet met XMLspy-parser werkt welke moet ik dan gebruiken en hoe?
offtopic:
Waar is de reply button geleven? ik heb nu quotebutton gebruikt en de quote weggehaald! Er zit geen slot op deze topic.
Ik weet niet precies welke versie van XmlSpy je probeert, maar voor zover ik weet biedt de gratis personal edition geen mogelijkheid om je XML tegen een DTD te parsen.

Misschien moet je eens zoeken naar plugins voor firefox? Zit vast wel iets tussen dat een XML tegen een DTD aan kan houden en ook nog eens je XSL er overheen kan halen :)

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

rrrandy schreef op woensdag 08 november 2006 @ 09:31:
[...]
Misschien moet je eens zoeken naar plugins voor firefox? Zit vast wel iets tussen dat een XML tegen een DTD aan kan houden en ook nog eens je XSL er overheen kan halen :)
Er zijn wel plannen om dat native te gaan ondersteunen in Firefox, maar vooralsnog blijft het gewoon schipperen met XML/XSL in browseromgevingen door gebrekkige en buggy ondersteuning...

Intentionally left blank


  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 27-06 13:00
Wellicht dat je hier iets mee kunt:

XML Developer Toolbar

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Verwijderd schreef op dinsdag 07 november 2006 @ 18:19:
Whahhhh..... Is het nu echt niet mogelijk om fatsoenlijke pagina's met xml en xsl op mijn desktop te tonen zonder server-sided script ervoor te schrijven.

Ik dacht ga uitzoeken hoe ik dmv. xsl-module voor php via apache html kan laten uitpoepen, maar dat gaat ik niet 123... (correct me if i'm wrong). Ik kan php nog niet goed genoeg omdat voor elkaar te krijgen.

Hoe kan je als beginner XML icm. DTD, XSL, namespace en de hele mikmak makkelijk op je desktop draaien? Dwz. testen, valideren en in browserwindow.
XML en XSL(T) gaat prima in een browser (naar mijn ervaringen), zolang het ook niet nog eens wilt laten valideren en externe entiteiten wilt gebruiken :)

Als je het wel wilt laten valideren (door middel van DTD of het nieuwe XSD, veel beter IMHO), dan ontkom je niet aan een validerende parser aan de server kant.

Wat je ook kan doen is het geheel door een XSLT processor halen (XALAN bijvoorbeeld) een zo (X)HTML uit te laten spugen, deze output kan je dan gewoon in de browser bekijken. Dan is de XML ook nog eens gevalideerd.

Ducati: making mechanics out of riders since 1946


  • .Johnny
  • Registratie: September 2002
  • Laatst online: 27-10 11:50
XML en XSL gaat ook best ok met PHP. Het is alweer even geleden dat ik me daarmee bezig hield, maar volgens mij is het in elk geval in php 5 al een stuk simpeler gemaakt. Oudere versies vereisen allerlei kunst en vliegwerk in mn herinnering, of je moest de Sablot engine gebruiken, maar die is met PHP 5 dus overbodig.
Pagina: 1