グーグルクラウドストレージクライアントがクラウドストレージ上の「ファイルオブジェクト」をポイントしてlxmlで使用する方法はありますか?

プラサドサワント

Google Cloud Storage Clientを使用すると、lxml.etree.parseで必要とされるオブジェクトとしてストレージファイルを読み取ることができませんでした。クラウドストレージファイルをblobとして読み取ることはできましたが、lxmlではうまく機能しませんでした。

XSLTファイルを使用してXMLファイルを変換しようとしています。XMLファイルがCloudStorageにアップロードされるとすぐにトリガーされるGoogleCloud Function(Python3.7)が必要です。ファイルをローカルに保存してこのコードを試しましたが、機能します。ただし、これをCloudStorageでも機能させる方法が必要です。

----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  

ET.parseで期待されているようにファイルオブジェクトの代わりにXML文字列を渡すため、エラーが予想されます。これを機能させるためにクラウドストレージからファイルオブジェクトを渡すにはどうすればよいですか?

ダスティンイングラム

この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

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ