Разбор с SAX и обработка символьных сущностей

Я анализирую выражение 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 ответ

Решение

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

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

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

Другие вопросы по тегам