この方法で lxml を使用して MathML XML 文字列を検証しようとしています。
import lxml.etree
mathml = """
<!DOCTYPE math PUBLIC "-//W3C//DTD MathML 3.0//EN" "http://www.w3.org/Math/DTD/mathml3/mathml3.dtd">
<math xmlns="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink">
<mi>a</mi>
<mo>+</mo>
<mi>b</mi>
</math>
"""
lxml_parser = lxml.etree.XMLParser(
dtd_validation=True,
no_network=False,
load_dtd=True,
ns_clean=True,
remove_blank_text=True,
)
validated = lxml.etree.fromstring(xml, lxml_parser)
このようにして、mathml 文字列で指定された DTD に対してチェックし、ネットワークを介して文字列を検証します。
質問
利用可能な nwtwork がない場合、ローカル DTD に対して mathml 文字列を検証するにはどうすればよいですか?
私が試したこと
https://www.w3.org/Math/DTD/mathml3/mathml3.dtdから MathML DTD 3 をダウンロードし、https : //www.w3.org/Math/DTD/mathml1/ から MathML DTD 1をダウンロードしました。 mathml.dtdを作成して現在の作業ディレクトリに保存した後、ローカル DTD を指すように DOCTYPE 宣言を変更しまし<!DOCTYPE math SYSTEM "path/to/mathml_dtd.dtd">
たno_network=True
。
import lxml.etree
mathml = """
<!DOCTYPE math SYSTEM "path/to/dtd/mathml3.dtd">
<math xmlns="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink">
<mrow>
<mo>⌊</mo>
<mrow>
<mi>a</mi>
</mrow>
<mo>⌋</mo>
</mrow>
</math>
"""
lxml_parser = lxml.etree.XMLParser(
dtd_validation=True,
no_network=True,
load_dtd=True,
ns_clean=True,
remove_blank_text=True,
)
validated = lxml.etree.fromstring(xml, lxml_parser)
私はこのエラーを持っています:
File "/projects/py_asciimath/py_asciimath/parser/parser.py", line 117, in __dtd_validation
return lxml.etree.fromstring(xml, lxml_parser)
File "src/lxml/etree.pyx", line 3235, in lxml.etree.fromstring
File "src/lxml/parser.pxi", line 1876, in lxml.etree._parseMemoryDocument
File "src/lxml/parser.pxi", line 1757, in lxml.etree._parseDoc
File "src/lxml/parser.pxi", line 1068, in lxml.etree._BaseParser._parseUnicodeDoc
File "src/lxml/parser.pxi", line 601, in lxml.etree._ParserContext._handleParseResultDoc
File "src/lxml/parser.pxi", line 711, in lxml.etree._handleParseResult
File "src/lxml/parser.pxi", line 640, in lxml.etree._raiseParseError
File "/projects/py_asciimath/py_asciimath/translation/dtd/mathml3.dtd", line 36
lxml.etree.XMLSyntaxError: conditional section INCLUDE or IGNORE keyword expected, line 36, column 17
MathML DTD 1 のローカル コピーを使用すると、代わりに次のようになります。
File "/projects/py_asciimath/py_asciimath/parser/parser.py", line 117, in __dtd_validation
return lxml.etree.fromstring(xml, lxml_parser)
File "src/lxml/etree.pyx", line 3235, in lxml.etree.fromstring
File "src/lxml/parser.pxi", line 1876, in lxml.etree._parseMemoryDocument
File "src/lxml/parser.pxi", line 1757, in lxml.etree._parseDoc
File "src/lxml/parser.pxi", line 1068, in lxml.etree._BaseParser._parseUnicodeDoc
File "src/lxml/parser.pxi", line 601, in lxml.etree._ParserContext._handleParseResultDoc
File "src/lxml/parser.pxi", line 711, in lxml.etree._handleParseResult
File "src/lxml/parser.pxi", line 640, in lxml.etree._raiseParseError
File "<string>", line 1
lxml.etree.XMLSyntaxError: Entity 'lfloor' not defined, line 1, column 135