libxml2:xpathEval: xmlns はネームスペース登録が必要ですよ!

(op)hdknr@debuniid:~/.virtualenvs/op/src/PyXMLSec/sample$ more x.py
import libxml2,traceback,sys

x=”'<?xml version="1.0" encoding="UTF-8"?>
<!– OpenID CX Contract –>
<Contract>
    <Name>Sample Proposal</Name>
    <Rp>Relying Party</Rp>
</Contract>
”’

doc = libxml2.parseDoc(x.encode(‘UTF-8’))
ctx = doc.xpathNewContext()
res = ctx.xpathEval(‘/Contract/Rp’)
print "1.", res[0].content

x=”'<?xml version="1.0" encoding="UTF-8"?>
<!– OpenID CX Contract –>
<Contract>
    <Name>Sample Proposal</Name>
    <Rp ns=’hoge’ >Relying Party</Rp>
</Contract>
”’
doc = libxml2.parseDoc(x.encode(‘UTF-8’))
ctx = doc.xpathNewContext()
res = ctx.xpathEval("/Contract/Rp[@ns=’hoge’]")
print "2.", res[0].content

x=”'<?xml version="1.0" encoding="UTF-8"?>
<!– OpenID CX Contract –>
<Contract>
    <Name>Sample Proposal</Name>
    <Rp ns=’hoge’ >Relying Party</Rp>
    <Rp xmlns=’http://www.w3.org/2000/09/xmldsig#’>Relying Party 2</Rp>
</Contract>
”’

doc = libxml2.parseDoc(x.encode(‘UTF-8’))
ctx = doc.xpathNewContext()
res = ctx.xpathEval("/Contract/Rp[@ns=’hoge’]")
print "3-1.",res[0].content

try:
    ctx = doc.xpathNewContext()
    res = ctx.xpathEval(‘/Contract/Rp[@xmlns="http://www.w3.org/2000/09/xmldsig#"]’)
    print "3-2",res[0].content
except:
    print "\n*****************************"
    traceback.print_exc(file=sys.stdout)
    print "\n*****************************"

ctx = doc.xpathNewContext()
ctx.xpathRegisterNs("xmlns", "http://www.w3.org/2000/09/xmldsig#")
res = ctx.xpathEval(‘/Contract/xmlns:Rp’)
print "3-2",res[0].content

実行

(op)hdknr@debuniid:~/.virtualenvs/op/src/PyXMLSec/sample$ python x.py
1. Relying Party
2. Relying Party
3-1. Relying Party
3-2
*****************************
Traceback (most recent call last):
  File "x.py", line 48, in <module>
    print "3-2",res[0].content
IndexError: list index out of range

*****************************
3-2 Relying Party 2

カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中