[英]Parse XML in Python but ignoring entity
我必须传递一个 XML 文件并将数据存储到数据库中。 问题是这个 XML 有一些我不想导入的实体,但相反,我想要原始实体标签。 为了更好地澄清,我有以下架构:
<!ENTITY exa "example">
.....
<mytag>&exa;</mytag>
如果我尝试使用以下代码解析上面读取标签“mytag”的代码:
import xml.etree.ElementTree as ET
tree = ET.parse(xmlfile)
root = tree.getroot()
for item in root:
if item.tag == "mytag":
我读了字符串“example”。 相反,我想要标签“exa”。 我想是可能的,但因为我是新的 t python delelompent 我找不到正确的方法来获得这个结果。 一些建议? 谢谢
下面是一个开始的例子:
import os
import re
from lxml import etree
xmlfile = 'testfile.xml'
xml_path = '%s/%s' % (os.path.dirname(os.path.realpath(__file__)), xmlfile)
parser = etree.XMLParser(resolve_entities=False)
tree = etree.parse(xml_path, parser)
# root = tree.getroot()
root = tree.xpath('/mytag')
for item in root:
entity = etree.tostring(item, pretty_print=True).decode('utf-8')
print('ENTITY : ', entity)
entity_value = re.findall(r'&(.*?);', entity)
print('Parsed str : ', entity_value)
但是可能有一种更简单的方法来恢复该值。
您可以修改 xml 文件中的每个ENTITY
标记,以便它们具有您想要的值,然后在最后将它们修改回来。
您可以创建一个类来克隆您的 xml 文件:
import os
import re
class NoEntities:
"""
Creates a clone of the target xml file such that the <!ENTITY x "y"> tags
become <!ENTITY x "x">.
"""
def __init__(self, xmlFile):
self.targetName = xmlFile
self.tmpName = 'temp.xml'
def __enter__(self):
match = r'<!ENTITY\s+(\S+)\s+"[^"]+"\s*>'
replace = r'<!ENTITY \1 "\1">'
with open(self.targetName) as target:
with open(self.tmpName, 'w') as tmp:
tmp.writelines(
re.sub(match, replace, line)
for line in target
)
return self.tmpName
def __exit__(self, *exec_info):
os.remove(self.tmpName)
然后在 with 块中使用它:
import xml.etree.ElementTree as ET
with NoEntities(pathToOriginalXml) as noEntityXml:
tree = ET.parse(noEntityXml)
# Do what you like...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.