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]
コメントを追加