/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
JAXP - Hvordan genkender jeg entities ?
Fra : Peter Lind


Dato : 07-03-01 16:44

Hejsa gruppe...

Forhåbentlig er der nogle derude, der kan hjælpe mig med mit ret irriterende
problem.
Jeg har i lang tid brugt JAXP og herunder DOM til at læse og skrive XML
dokumenter, men først nu er det gået op for mig at jeg ikke har taget højde
for entities & og den slags...

Mit spørgsmål lyder kort og godt ? Hvordan læser jeg en entity ud af et
element i min XML fil, og hvordan konverterer jeg den entity til noget
klartekst.

Min program-stump ser indtil videre således ud ( currentNode er en private
variabel for den Node jeg er nået til i min parsning):

public String getText() throws IOException
{
String tagtext = "";
if( currentNode.hasChildNodes() &&
currentNode.getFirstChild().getNodeType() == Node.TEXT_NODE )
{
// Scan all children to the current-node
for( Node textNode=currentNode.getFirstChild(); textNode != null;
textNode = textNode.getNextSibling() )
{
if( textNode.getNodeType() == Node.TEXT_NODE )
{
tagtext = tagtext + textNode.getNodeValue();
}

if( textNode.getNodeType() == Node.ENTITY_REFERENCE_NODE )
{
// Hvad kan jeg gøre med min entity her ???
}
}
}
return tagtext;
}

Det er sikkert ganske enkelt - jeg kan simpelthen bare ikke se det for mig.
Håber der er nogen der kan hjælpe

mvh
Peter Lind



 
 
Dennis Thrysøe (08-03-2001)
Kommentar
Fra : Dennis Thrysøe


Dato : 08-03-01 08:09

Hi,

Jeg mener, at character refrences (Ӓ) og standard entities
(") bliver expanded automatisk.

Entity refrences er så nogle der henviser til lokalt definerede entities.

Citat fra JavaDoc'en for org.w3c.dom.EntityReference:

"EntityReference objects may be inserted into the structure model when
an entity reference is in the source document, or when the user wishes
to insert an entity reference. Note that character references and
references to predefined entities are considered to be expanded by the
HTML or XML processor so that characters are represented by their
Unicode equivalent rather than by an entity reference. Moreover, the XML
processor may completely expand references to entities while building
the structure model, instead of providing EntityReference objects. If it
does provide such objects, then for a given EntityReference node, it may
be that there is no Entity node representing the referenced entity. If
such an Entity exists, then the subtree of the EntityReference node is
in general a copy of the Entity node subtree. However, this may not be
true when an entity contains an unbound namespace prefix. In such a
case, because the namespace prefix resolution depends on where the
entity reference is, the descendants of the EntityReference node may be
bound to different namespace URIs."


-dennis


Peter Lind wrote:

> Hejsa gruppe...
>
> Forhåbentlig er der nogle derude, der kan hjælpe mig med mit ret irriterende
> problem.
> Jeg har i lang tid brugt JAXP og herunder DOM til at læse og skrive XML
> dokumenter, men først nu er det gået op for mig at jeg ikke har taget højde
> for entities & og den slags...
>
> Mit spørgsmål lyder kort og godt ? Hvordan læser jeg en entity ud af et
> element i min XML fil, og hvordan konverterer jeg den entity til noget
> klartekst.
>
> Min program-stump ser indtil videre således ud ( currentNode er en private
> variabel for den Node jeg er nået til i min parsning):
>
> public String getText() throws IOException
> {
> String tagtext = "";
> if( currentNode.hasChildNodes() &&
> currentNode.getFirstChild().getNodeType() == Node.TEXT_NODE )
> {
> // Scan all children to the current-node
> for( Node textNode=currentNode.getFirstChild(); textNode != null;
> textNode = textNode.getNextSibling() )
> {
> if( textNode.getNodeType() == Node.TEXT_NODE )
> {
> tagtext = tagtext + textNode.getNodeValue();
> }
>
> if( textNode.getNodeType() == Node.ENTITY_REFERENCE_NODE )
> {
> // Hvad kan jeg gøre med min entity her ???
> }
> }
> }
> return tagtext;
> }
>
> Det er sikkert ganske enkelt - jeg kan simpelthen bare ikke se det for mig.
> Håber der er nogen der kan hjælpe
>
> mvh
> Peter Lind


Thorbjørn Ravn Ander~ (08-03-2001)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 08-03-01 10:17

Peter Lind wrote:
>
> Hejsa gruppe...
>
> Forhåbentlig er der nogle derude, der kan hjælpe mig med mit ret irriterende
> problem.
> Jeg har i lang tid brugt JAXP og herunder DOM til at læse og skrive XML
> dokumenter, men først nu er det gået op for mig at jeg ikke har taget højde
> for entities & og den slags...
>
> Mit spørgsmål lyder kort og godt ? Hvordan læser jeg en entity ud af et
> element i min XML fil, og hvordan konverterer jeg den entity til noget
> klartekst.

Det skulle ikke være nødvendigt - alle sædvanlige entiteter skulle gerne
blive lavet til klartekst (Unicode tegn) via <!ENTITY definitoner i
DTD-sektionen, og derfor dukke op som en helt almindelig del af din XML
(ofte splitter XML-parseren dog tekstblokke ved entiteter - det er dit
ansvar at samle tekstblokke sammen). Det du muligvis er ramlet ind i er
muligheden for en _ekstern_ entitet, hvor man kan definere at noget skal
undgå parsning

(http://www.w3.org/TR/2000/REC-xml-20001006#sec-external-ent).

Jeg har endnu ikke set et XML-dokument som har sådan et.

Indbyggede entiteter er &amp; &lt; og &gt; Alle andre skal defineres i
en DTD.

--
Thorbjørn Ravn Andersen "...sound of...Tubular Bells!"
http://bigfoot.com/~thunderbear

Peter Lind (08-03-2001)
Kommentar
Fra : Peter Lind


Dato : 08-03-01 11:24

Hejsa

Jeg takker ydmygst de behjælpelige mennesker, der ledte mig i den rigtige
retning.
Måske sidder der andre der har samme problem, så jeg vil blot runde af med
at fortælle hvordan problemet endelig blev løst.

Som flere har nævnt, så klarer XML parseren selv standard entiteter ( &amp;
&lt; og den slags ) og det var netop dem jeg ikke kunne finde i mit DOM træ.
En entity ligger som en sibling til textNode, og for at få at vide hvad
entitien bliver til, skal man læse dens childNode(s), og finde indholdet af
disse textnodes.

Det stykke kode der virker ser således ud:

public String getText()
{
String tagtext = "";

if( currentNode.hasChildNodes() &&
currentNode.getFirstChild().getNodeType() == Node.TEXT_NODE )
{
// Scan all children to the current-node
for( Node textNode=currentNode.getFirstChild(); textNode != null;
textNode = textNode.getNextSibling() )
{
if( textNode.getNodeType() == Node.TEXT_NODE )
{
tagtext = tagtext + textNode.getNodeValue();
}

if( textNode.getNodeType() == Node.ENTITY_REFERENCE_NODE )
{
if( textNode.hasChildNodes() )
{
for( Node entNode = textNode.getFirstChild(); entNode != null;
entNode = entNode.getNextSibling() )
{
// The getNodeValue of this node contains the actual text to
enter into the tag
tagtext = tagtext + entNode.getNodeValue();
}
}
}
}
}
return tagtext;
}

Mange tak for hjælp og hints...

Mvh Peter Lind



Niels Ull Harremoës (08-03-2001)
Kommentar
Fra : Niels Ull Harremoës


Dato : 08-03-01 18:20

Du kan vist nok godt have nestede enitites - dvs. entities,der expander til
andre entities. Det skal du evt håndtere?
Og du ved selvfølgelig godt, at du af performancegrunde "bør" bruge en
StringBuffer. Jeg vil foreslå en funktion a la

public void getText(Node currentNode, StringBuffer buf)
{
if (currentNode.getNodeType() == TEXT_NODE) {
buf.append( currentNode.getNodeValue())
}else {
// Scan all children of the current-node
for(Node child=currentNode.getFirstChild(); child != null; child =
child.getNextSibling() )
{
getText(child, buf);
}
}
}




Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste