google 云存储客户端是否可以指向云存储上的 'file object' 以供 lxml 使用?

Is there a way for google cloud storage client to point to 'file object' on cloud storage to be then used by lxml?

使用 Google 云存储客户端,我无法按照 lxml.etree.parse 的要求将存储文件作为对象读取。我可以将云存储文件作为一个 blob 来读取,但这在 lxml 中效果不佳。

我正在尝试使用 XSLT 文件转换 XML 文件。我想要一个 Google 云函数(在 Python3.7 中),一旦 XML 文件上传到云存储就会被触发。我已经通过在本地存储文件来尝试此代码并且它有效。但是,还需要一种方法来使其与云存储一起使用。

----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 预期的文件对象 我怎样才能从云存储传递一个文件对象来让它工作?

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