2016-01-30 29 views
0

這是我在這裏的第一篇文章...如何更改Hy中XML標籤的名稱?

我想在Hy(運行於Python 3)中使用assignment更改XML元素。

當我嘗試運行代碼片段:

(setv tco (BeautifulSoup "<meek/>" 'xml)) 
(setv (. tco meek name) "defl") 
(print (. tco meek name)) 
;(assoc (. tco defl) "new" "value") 
(.append (. tco meek) "Kool Stuff") 
(print (.prettify tco)) 

我得到的錯誤:

Traceback (most recent call last): File "/usr/bin/hy", line 9, in load_entry_point('hy==0.11.0', 'console_scripts', 'hy')() File "/usr/lib/python3/dist-packages/hy/cmdline.py", line 347, in hy_main sys.exit(cmdline_handler("hy", sys.argv)) File "/usr/lib/python3/dist-packages/hy/cmdline.py", line 335, in cmdline_handler return run_file(options.args[0]) File "/usr/lib/python3/dist-packages/hy/cmdline.py", line 210, in run_file import_file_to_module("main", filename) File "/usr/lib/python3/dist-packages/hy/importer.py", line 78, in import_file_to_module eval(ast_compile(_ast, fpath, "exec"), mod.dict) File "code-trace.hy", line 196, in (setv (. tco meek name) "defl") AttributeError: 'NoneType' object has no attribute 'name'

與第二行中運行評論說:

(setv tco (BeautifulSoup "<meek/>" 'xml)) 
;(setv (. tco meek name) "defl") 
(print (. tco meek name)) 
;(assoc (. tco defl) "new" "value") 
(.append (. tco meek) "Kool Stuff") 
(print (.prettify tco)) 

沒有給出錯誤(必須使用代碼而不是blockquote標記,以便正確顯示):

meek 
<?xml version="1.0" encoding="utf-8"?> 
<meek> 
Kool Stuff 
</meek> 

請注意,這只是一個較大程序的一些測試代碼。我在第四行的註釋assoc也有問題。

回答

0

這是一個奇怪的!它看起來像改變名稱使得(.tco meek)變成無,其確實沒有名稱屬性。所以你必須抓住那個錯誤。那麼你必須參考(.tco defl),因爲這是它在賦值之後被如何知道的。這工作。

#+BEGIN_SRC hy 
(import [bs4 [BeautifulSoup]]) 

(setv tco (BeautifulSoup "<meek/>" 'xml)) 
(try (setv (. tco meek name) "defl") (except [e Exception] (print e))) 
(print (. tco defl)) 
(assoc (. tco defl) "new" "value") 
(.append (. tco defl) "Kool Stuff") 
(print (.prettify tco)) 

#+END_SRC 
#+RESULTS: 
: 'NoneType' object has no attribute 'name' 
: <defl/> 
: <?xml version="1.0" encoding="utf-8"?> 
: <defl new="value"> 
: Kool Stuff 
: </defl> 

如果你看一下Python的是HY產生:_hy_anon_var_1 = tco.meek.name:

#+begin_example 
from hy import HySymbol 
from bs4 import BeautifulSoup 
tco = BeautifulSoup(u'<meek/>', HySymbol(u'xml')) 
try: 
    tco.meek.name = u'defl' 
    _hy_anon_var_1 = tco.meek.name 
except Exception as e: 
    _hy_anon_var_1 = print(e) 
print(tco.defl) 
tco.defl[u'new'] = u'value' 
tco.defl.append(u'Kool Stuff') 
print(tco.prettify()) 
#+end_example 

您可以在此行中看到的錯誤。我想tco.meek.name在它運行之前不存在,所以你得到錯誤。我不知道hy爲什麼會這樣擴展,它似乎與代碼中使用(。)有關,因爲其他setv表達式不會以這種方式擴展。