谷歌云存储客户端是否有办法指向云存储上的“文件对象”以供lxml使用?

时间:2019-01-17 10:51:01

标签: python-3.x xslt google-cloud-storage google-cloud-functions lxml

使用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期望的文件对象,因此会出现错误 如何从云端存储传递文件对象以使其正常工作?

1 个答案:

答案 0 :(得分:0)

lxml.etree.parse()函数需要一个字符串作为文件名。如果要传递文件内容,则需要将其包装在StringIOBytesIO中(在本例中为后者):

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