带有嵌套CDATA节的lxml

带有嵌套CDATA节的lxml,xml,lxml,cdata,Xml,Lxml,Cdata,我有XML(在别处生成,不受控制),它包含令人讨厌的嵌套CDATA,例如: <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE prc SYSTEM "prc.dtd"> <body> <![CDATA[Towards Automatic Generation blabla <definition> <query><![CDATA[ <root[ABy

我有XML(在别处生成,不受控制),它包含令人讨厌的嵌套CDATA,例如:

<?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>
因为它认为第一个
]]>
结束了CDATA,实际上它只结束了内部CDATA,而下面的标记
,仍然在外部CDATA中,不应该被解析


解析这种XML的好方法是什么?这意味着我希望CDATA中的所有内容都保持为未解析数据,即使其中包含更多CDATA。编写我自己的解析器?想法?

嵌套的CDATA是不合法的,因此这是无效的XML

CDATA节不能包含“]]>”。在XML中转义它的正确方法如下“]]]>”


嵌套的CDATA不合法,因此这是无效的XML

CDATA节不能包含“]]>”。在XML中转义它的正确方法如下“]]]>”


由于嵌套
CDATA
部分使其不是良好的XML格式,因此不能在其上使用任何XML工具

您需要使用能够处理嵌套结构的文本解析器,因此它需要计数器或堆栈支持。这排除了简单的正则表达式解决方案。如果
CDATA
部分是平衡的,则该任务在某种程度上可以与处理嵌套括号相媲美

展开嵌套的
CDATA
节的一种方法是使它们按顺序排列
CDATA

一些伪代码:

counter = 0 or stack is empty
when found "<![CDATA[" string
    if counter != 0 or stack not empty
        replace "<![CDATA[" with "]]><![CDATA["
    increase counter or push to stack
when found "]]>" string
    decrease counter or pop stack
    if counter != 0 or stack not empty
        replace "]]>" with "]]><![CDATA["
计数器=0或堆栈为空
当找到“”字符串时
减少计数器或弹出堆栈
如果计数器!=0或堆栈不为空

将“]]>”替换为“]]>,因为嵌套
CDATA
节使其不是格式良好的XML,所以不能在其上使用任何XML工具

您需要使用能够处理嵌套结构的文本解析器,因此它需要计数器或堆栈支持。这排除了简单的正则表达式解决方案。如果
CDATA
部分是平衡的,则该任务在某种程度上类似于处理嵌套括号

展开嵌套的
CDATA
节的一种方法是使它们按顺序排列
CDATA

一些伪代码:

counter = 0 or stack is empty
when found "<![CDATA[" string
    if counter != 0 or stack not empty
        replace "<![CDATA[" with "]]><![CDATA["
    increase counter or push to stack
when found "]]>" string
    decrease counter or pop stack
    if counter != 0 or stack not empty
        replace "]]>" with "]]><![CDATA["
计数器=0或堆栈为空
当找到“”字符串时
减少计数器或弹出堆栈
如果计数器!=0或堆栈不为空

将“]]>”替换为“]]>嗯,我看不出这种转义是如何工作的。。。也不知道这些信息如何帮助我解析格式错误的XML,即使它起作用。嗯,我不知道这种转义是如何起作用的。。。也不知道这些信息如何帮助我解析格式错误的XML,即使它有效。