使用ElementTree在节点内插入HTML

4 投票
4 回答
2962 浏览
提问于 2025-04-15 12:43

我正在使用ElementTree来解析一个XML文件。在某些字段中,会有HTML数据。比如,考虑下面这个声明:

<Course>
    <Description>Line 1<br />Line 2</Description>
</Course>

现在,假设_course是一个元素变量,它保存了这个课程元素。我想获取这个课程的描述,所以我这样做:

desc = _course.find("Description").text;

但是desc只包含“第一行”。我看到关于.tail属性的一些内容,所以我也尝试了:

desc = _course.find("Description").tail;

结果还是一样。我该怎么做才能让desc变成“第一行
第二行”(或者说任何在和之间的内容)?换句话说,我想要的东西类似于C#中的.innerText属性(我想其他很多语言也是这样)。

4 个回答

1

像"<"和"&"这样的字符在XML元素中是不能用的。

"<"会出错,因为解析器会把它当成一个新元素的开始。

"&"也会出错,因为解析器会把它当成一个字符实体的开始。

一些文本,比如JavaScript代码,里面会有很多"<"或"&"字符。为了避免出错,可以把脚本代码定义为CDATA。

CDATA部分里的内容会被解析器忽略。

CDATA部分是以"

想了解更多信息,可以查看这个链接:http://www.w3schools.com/xmL/xml_cdata.asp

希望这些信息对你有帮助!

3

你正在从错误的元素中读取尾部属性。试试这个:

desc = _course.find("br").tail;

尾部属性是用来存储在读取混合内容的XML文件时,元素后面直接跟着的文本节点的。也就是说,紧跟在某个元素后面的文本会被存储在那个元素的尾部属性里:

    <tag><elem>this goes into elem's
    text attribute</elem>this goes into
    elem's tail attribute</tag>

这里有一段简单的代码,可以打印出XML/XHTML中所有元素的文本和尾部属性:

import xml.etree.ElementTree as ET

def processElem(elem):
    if elem.text is not None:
        print elem.text
    for child in elem:
        processElem(child)
        if child.tail is not None:
            print child.tail

xml = '''<Course>
    <Description>Line 1<br />Line 2 <span>child text </span>child tail</Description>
    </Course>'''

root = ET.fromstring(xml)
processElem(root)

输出结果:

Line 1
Line 2 
child text 
child tail

想要更好的解决方案,可以查看这个链接:http://code.activestate.com/recipes/498286-elementtree-text-helper/。你可以根据自己的需要进行修改。

附言:我把我的名字从user839338改成了下一个帖子中引用的名字。

3

你有没有办法控制xml文件的创建?在xml标签里面的内容,如果也包含xml标签或者一些特殊字符(比如'<'),就需要进行编码,以避免出现问题。你可以通过以下几种方式来做到这一点:

  • 使用一个CDATA部分
  • 使用Base64或者其他不包含xml保留字符的编码方式
  • 使用实体编码(比如'<'等于'&lt;')

如果你不能做这些修改,而且ElementTree又无法忽略不在xml模式中的标签,那么你就需要先处理这个文件。当然,如果这个模式和html有重叠,那你就比较麻烦了。

撰写回答