谷歌云存储客户端有没有办法指向云存储上的'file object',然后由lxml使用?



使用Google Cloud Storage Client,我无法按照lxml.etree.parse的要求将存储文件作为对象读取。我可以将云存储文件读取为 blob,但这不适用于 lxml。

我正在尝试使用 XSLT 文件转换 XML 文件。我想要一个谷歌云函数(在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。

相关内容

  • 没有找到相关文章

最新更新