Analisi con SAX e la manipolazione entità carattere
-
26-10-2019 - |
Domanda
Io sono l'analisi di un'espressione MathML con SAX (anche se il fatto che si tratta di MathML potrebbe non essere del tutto pertinente). Un esempio di stringa di input è
<math xmlns='http://www.w3.org/1998/Math/MathML'>
<mrow>
<mo>λ</mo>
</mrow>
</math>
Affinché il parser SAX di accettare questa stringa, ho espandere un po ':
<?xml version="1.0"?>
<!DOCTYPE doc_type [
<!ENTITY nbsp " ">
<!ENTITY amp "&">
]>
<body>
<math xmlns='http://www.w3.org/1998/Math/MathML'>
<mrow>
<mo>λ</mo>
<mrow>
</math>
</body>
Ora, quando faccio funzionare il parser SAX su questo, ottengo un'eccezione:
[Fatal Error] :5:86: The entity "lambda" was referenced, but not declared.
org.xml.sax.SAXParseException: The entity "lambda" was referenced, but not
declared.
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
Tuttavia, so come risolvere questo. Ho semplicemente aggiungere questa riga alla stringa viene analizzata:
<!ENTITY lambda "Λ">
Questo mi dà
<?xml version="1.0"?>
<!DOCTYPE doc_type [
<!ENTITY nbsp " ">
<!ENTITY amp "&">
<!ENTITY lambda "Λ">
]>
<body>
<math xmlns='http://www.w3.org/1998/Math/MathML'>
<mrow>
<mo>λ</mo>
<mrow>
</math>
</body>
Ora, analizza bene, grazie.
Tuttavia, il problema è che non posso aggiungere una dichiarazione di entità per ogni entità carattere possibile che possono essere utilizzati nella MathML (per esempio, "parte", "notin", e "somma").
Come faccio a riscrivere questa stringa in modo che possa essere analizzato per qualsiasi entità carattere possibile che potrebbe essere incluso?
Soluzione
Utilizzare una dichiarazione DOCTYPE che si riferisce alla MathML DTD :
<!DOCTYPE math
PUBLIC "-//W3C//DTD MathML 3.0//EN"
"http://www.w3.org/Math/DTD/mathml3/mathml3.dtd">
o una copia locale dello stesso.