如何从python客户端在baseX数据库的xml文件中将节点插入现有节点?

时间:2017-09-02 14:52:50

标签: python xml database basex

我正在尝试将字符串中的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中的内容一起插入此节点内的现有节点?

谢谢!

1 个答案:

答案 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端部署。