2015-09-04 50 views
0

所以我有一个大的XML文件,我解析出数据。下面是一个例子:如何迭代ElementTree并删除所有<mark>标签?

<statement> 
<plist> 
<p>Hello Stack Overflow.</p> 
<p>This doesn't <mark type="NA" /> seem to work!</p> 
</plist> 
</statement> 

我已经开发了只返回节目“你好,堆栈溢出这不” 为了解析行的其余部分,我想在之前移除标记标签解析。使用root.findall('。mark')函数时,我能够找到标记,但在遍历findall函数的返回时无法运行,因此root.remove(标记)不起作用,因为从根到这些标记的路径是未知的。我也试图找到p标签的所有实例并搜索它们的标记标签,然后使用“p标签”.remove(“标记标签”)将其删除,但这并没有失败,但似乎也没有工作。有什么建议么?

这不是任何需要lxml导入的重复工作,因为这可能没有依赖关系,只能使用元素树功能来解决。

+0

要删除元素,显然需要知道元素的* parent *。你看过'ElementTree'元素上的可用方法吗? – larsks

+0

是的,没有直接的方式来访问父节点。但正如我之前所说的,所有标记标签都位于p标签所包含的文本中。因此,通过遍历所有p标签并检查是否包含'mark',我可以找到父节点(p标签)并使用它去除标记标签。但是,在完成此操作并试图解析文本之后,文本在标记标记(或仍然存在)的位置仍然会切断。所以我有点不知所措。 – JJJ1106

+0

*有一种直接访问父节点的方式。 – larsks

回答

0

ElementTree将< mark/>之前的文本解析为包含p标记的'text'属性,并将它后面的文本转换为mark标记的'tail'属性。

解决方法是找到p标签,在标签内部寻找标签,在删除标签之前,将其尾部值附加到包含p的文本中。