我想把这些句子变成xml。
I will meet you at 1st.
5th... OK, 5th?
today is 2ndn
Aug.3rd
喜欢这个:
<Text VAlign="top" VPosition="85.00">
I will meet you at 1<Font Script="super">st</Font>.
</Text>
<Text VAlign="top" VPosition="85.00">
5<Font Script="super">th</Font>... OK, 5<Font Script="super">th</Font>
</Text>
<Text VAlign="top" VPosition="85.00">
today is 2<Font Script="super">nd</Font>n
</Text>
<Text VAlign="top" VPosition="85.00">
Aug.3<Font Script="super">rd</Font>n
</Text>
我正在使用minidom,但是经过许多帖子和答案,我不介意使用其他解析器重写我的代码。一开始,我认为这很容易,只需将st|nd|rd|th
替换为
<Font Script="super">st|nd|rd|th</Font>
,然后用这个新字符串创建文本节点()。
但是,该符号<, > and "
结果是通过writexml()方法< > and $quot;
的。 它适用于XML规范,但不适合读取。
我该怎么做?非常感谢。
以下是你可以使用标准库中的xml.etree.ElementTree做什么:
import re
import xml.etree.ElementTree as ET
data = """I will meet you at 1st.
5th... OK, 5th?
today is 2nd
Aug.3rd"""
endings = ['st', 'th', 'nd', 'rd']
pattern = re.compile('(%s)' % "|".join(endings))
root = ET.Element('root')
for line in data.split('n'):
items = []
for item in re.split(pattern, line):
if item in endings:
items.append('<Font Script="super">%s</Font>' % item)
else:
items.append(item)
element = ET.fromstring("""<Text VAlign="top" VPosition="85.00">%s</Text>""" % ''.join(items))
root.append(element)
print ET.tostring(root)
它生成以下 xml:
<root>
<Text VAlign="top" VPosition="85.00">I will meet you at 1<Font Script="super">st</Font>.
</Text>
<Text VAlign="top" VPosition="85.00">5<Font Script="super">th</Font>... OK, 5<Font Script="super">th</Font>?
</Text>
<Text VAlign="top" VPosition="85.00">today is 2
<Font Script="super">nd</Font>
</Text>
<Text VAlign="top" VPosition="85.00">Aug.3
<Font Script="super">rd</Font>
</Text>
</root>
为了使输出带有推进缩进和换行符,我需要 lxml,我把它放在 alecxe 的代码中。
from lxml import etree as ET
print ET.tostring(root, pretty_print=True)