使用Google Cloud Storage Client,我无法按照lxml.etree.parse的要求将存储文件作为对象读取。我可以将Cloud存储文件作为Blob读取,但是对于lxml来说效果不佳。
我正在尝试使用XSLT文件转换XML文件。我想拥有一个Google Cloud Function(在Python3.7中),将XML文件上传到Cloud Storage后立即触发。我已经通过在本地存储文件来尝试了此代码,并且它可以工作。但是,还需要一种方法也可以使它与Cloud Storage一起使用。
----Using local files (Working Code):
import lxml.etree as ET
filename = "C:\\GCP\\Files\\Profile.xml"
xsltfile = "C:\\GCP\\Files\\Transform.xslt"
outpath = "C:\\GCP\\Files\\Output\\Output.json"
dom = ET.parse(filename)
xslt = ET.parse(xsltfile)
transform = ET.XSLT(xslt)
newdom = transform(dom)
xdom = str(newdom)
text_file = open(outpath, "w")
text_file.write(xdom)
text_file.close()
----Using Cloud storage(not working):
from google.cloud import storage
import lxml.etree as ET
client = storage.Client()
bucket = client.get_bucket('customerfile02')
xmlblob = bucket.blob('testprofile.xml')
inputxml=xmlblob.download_as_string()
xmldom = ET.parse(inputxml)
Error: failed to load external entity
由于我正在传递XML字符串而不是ET.parse期望的文件对象,因此会出现错误 如何从云端存储传递文件对象以使其正常工作?
答案 0 :(得分:0)
lxml.etree.parse()
函数需要一个字符串作为文件名。如果要传递文件内容,则需要将其包装在StringIO
或BytesIO
中(在本例中为后者):
from io import BytesIO
from google.cloud import storage
import lxml.etree as ET
client = storage.Client()
bucket = client.get_bucket('customerfile02')
xmlblob = bucket.blob('testprofile.xml')
inputxml = xmlblob.download_as_string()
xmldom = ET.parse(BytesIO(inputxml))
在此处查看lxml
文档:https://lxml.de/parsing.html。