Разбор с SAX и обработка символьных сущностей - PullRequest
4 голосов
/ 10 июня 2011

Я анализирую выражение MathML с помощью SAX (хотя тот факт, что это MathML, может быть не совсем уместным).Пример входной строки:

<math xmlns='http://www.w3.org/1998/Math/MathML'>
     <mrow>
          <mo>&lambda;</mo>
     </mrow>
</math>

Чтобы синтаксический анализатор SAX мог принять эту строку, я его немного расширяю:

<?xml version="1.0"?>
     <!DOCTYPE doc_type [
          <!ENTITY nbsp "&#160;">
          <!ENTITY amp "&#38;">
]>
<body>
     <math xmlns='http://www.w3.org/1998/Math/MathML'>
          <mrow>
               <mo>&lambda;</mo>
          <mrow>
     </math>
</body>

Теперь, когда я запускаю парсер SAX на этомЯ получаю исключение:

[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)

Однако я знаю, как это исправить.Я просто добавляю эту строку к анализируемой строке:

        <!ENTITY lambda "&#923;">

Это дает мне

<?xml version="1.0"?>
     <!DOCTYPE doc_type [
          <!ENTITY nbsp "&#160;">
          <!ENTITY amp "&#38;">
          <!ENTITY lambda "&#923;">
]>
<body>
     <math xmlns='http://www.w3.org/1998/Math/MathML'>
          <mrow>
               <mo>&lambda;</mo>
          <mrow>
     </math>
</body>

Теперь, это просто разбирается, спасибо.

Однако,проблема в том, что я не могу добавить объявление ENTITY для каждой возможной символьной сущности, которая может использоваться в MathML (например, «part», «notin» и «sum»).

Как переписать эту строку, чтобы ее можно было проанализировать для любой возможной символьной сущности, которая может быть включена?

1 Ответ

5 голосов
/ 11 июня 2011

Используйте объявление DOCTYPE, которое ссылается на MathML DTD :

<!DOCTYPE math 
    PUBLIC "-//W3C//DTD MathML 3.0//EN"
           "http://www.w3.org/Math/DTD/mathml3/mathml3.dtd">

или локальная копия того же.

...