我正在尝试将字符串中的xml节点插入到现有xml节点中的BaseX XML-DB中的现有xml文件中。
这适用于BaseX Editor,但它无法从BaseX Python客户端运行。
其他查询正在使用python。
以前我在XML中的XML:
mydata.xml
<a/>
在BaseX编辑器中执行:
let $col := collection("mydb/mypath/mydata.xml")
let $inp := "<b><c>My Content</c></b>"
for $doc in $col
return insert node fn:parse-xml($inp) into $doc//a
结果XML:
mydata.xml
<a>
<b>
<c>My Content</c>
</b>
</a>
这很好用。
但如果我从Python客户端做同样的事情,那么我在数据库中的XML是不受影响的:
在Python中:
session = BaseXClient.Session(DB_HOST, DB_PORT, DB_USER, DB_PASS)
session.execute("open mydb")
query = session.query(
"""
let $col := collection("mydb/mypath/mydata.xml")
let $inp := "<b><c>My Content</c></b>"
for $doc in $col
return insert node fn:parse-xml($inp) into $doc//a
""")
结果: mydata.xml
<a/>
Python中的数据库会话有效,我可以毫无问题地进行其他查询。
所以我不知道这里的问题是什么,没有错误发生。但是没有插入节点。
如何在现有mydata.xml中将我的内容与python中的内容一起插入此节点内的现有节点?
谢谢!
答案 0 :(得分:0)
试试这个:
try:
session = BaseXClient.Session(DB_HOST, DB_PORT, DB_USER, DB_PASS)
query = 'let $col := collection("mydb/mypath/mydata.xml") ' \
'let $inp := "<b><c>My Content</c></b>" ' \
'for $doc in $col ' \
'return insert node fn:parse-xml($inp) into $doc//a'
queryObject = session.query(query)
queryObject.execute()
queryObject.close()
finally:
if session:
session.close()
打开BaseX数据库时不要运行此脚本,例如在处理Python脚本时打开BaseX GUI。
确保始终首先在GUI上(在虚拟数据库中)尝试查询,然后在Python端部署。