使用SAX进行解析并处理字符实体

时间:2011-06-10 15:36:54

标签: parsing sax mathml character-entities

我正在使用SAX解析MathML表达式(尽管它的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>

现在,它解析得很好,谢谢。

然而,问题在于我无法为MathML中可能使用的每个可能的字符实体添加ENTITY声明(例如,“part”,“notin”和“sum”)。

如何重写此字符串,以便可以针对可能包含的任何可能的字符实体进行解析?

1 个答案:

答案 0 :(得分:5)

使用引用MathML DTD

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

或相同的本地副本。