2011-06-10 49 views
4

我用SAX解析一個MathML表達式(雖然它的MathML可能不完全相關)。一個例子輸入字符串是用SAX解析並處理字符實體

<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中使用的每個可能的字符實體(例如「part」,「notin」和「sum」)添加ENTITY聲明。

如何重寫此字符串以便可以解析可能包含的任何可能的字符實體?

+0

請注意,結束標記必須爲'',否則無法解析,因爲它的格式不正確。 – Gunther 2011-06-11 10:13:09

回答

5

使用DOCTYPE聲明,指MathML DTD

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

或相同的本地副本。