たとえば、次のような厄介なネストされたCDATAを含むXML(他の場所で生成され、制御できない)があります。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE prc SYSTEM "prc.dtd">
<body>
<![CDATA[Towards Automatic Generation blabla
<definition>
<query><![CDATA[ <root[AByS]> <sc methodName="get_NYT.ARTICLES" serviceURL="http://www.nytimes.com/srv/">
<params> <param name="subjectP" value="{ subjectP }"> </> </> </> <sc methodName="get_WP.ARTICLES"
serviceURL="http://www.wpost.com/srv/"> <params> <param name="subjectP" value="{ subjectP }"> </> </>
</> </>; ]]></query> </definition> </serviceDefinition> (b) Figure 7. (a) The query for Web service
]]>
</body>
lxml
(Python) 爆弾
XMLSyntaxError: Opening and ending tag mismatch: body line 3 and query, line 9, column 28
最初]]>
のタグで CDATA が終了すると見なされるため、実際には内側の CDATA のみが終了し、次のタグ</query>
はまだ外側の CDATA 内にあり、解析されるべきではありません。
そのような XML を解析する良い方法は何ですか? つまり、内部に CDATA がさらに含まれていても、CDATA 内のすべてを未解析データのままにしておきたいということです。独自のパーサーを作成しますか? アイデア?