2014-01-24 32 views
4

我想更新XML配置文件中的某個部分,或者添加一個新部分(如果不存在,則已經使用Augeas)。使用Augeas創建或更新XML文件中的部分

的XML文件是這樣的:

<?xml version="1.0"?> 
<security> 
      <users> 
      ... 
      <user> 
       <id>deployment</id> 
       <firstName>Deployment</firstName> 
       <lastName>User</lastName> 
       <password>somepasshere</password> 
       <status>active</status> 
       <email>[email protected]</email> 
      </user> 
      </users> 
</security> 

我想如果ID更新已經存在姓/名/電子郵件或添加新的用戶部分,如果它是一個新的ID。

在AugTool我用:

augtool> set /augeas/load/Xml/lens Xml.lns 
augtool> set /augeas/load/Xml/incl /security.xml 
augtool> load 

我還在學習Augeas,所以這是我第一次嘗試以獲取節點:

augtool> print /files/security.xml/security/users/user/*[ #text= 'deployment'] 

會是什麼命令來更新或創建用戶中有新用戶?

謝謝!

回答

6

首先,使用近期的Augeas版本(> = 1.0.0),您可以使用--transform來設置轉換。比方說,該文件是./users.xml

$ augtool -r . --noautoload --transform "Xml.lns incl /users.xml" 
augtool> defnode user /files/users.xml/security/users/user[id/#text="deployment"] # Create a new user entry if it doesn't exist yet, assign node to the "user" variable 
augtool> set $user/id/#text "deployment"   # Set id if node was just created 
augtool> set $user/firstName/#text "Deployment" # Set firstName 
augtool> set $user/lastName/#text "User"   # Set lastName 
augtool> set $user/email/#text "[email protected]" # set email 
... 
augtool> save 
Saved 1 file(s) 

,你甚至可以把它變成一個劇本,說user.augtool

#!/usr/bin/augtool -sf 
defnode user /files/users.xml/security/users/user[id/#text="deployment"] 
set $user/id/#text "deployment" 
set $user/firstName/#text "Deployment" 
set $user/lastName/#text "User" 
set $user/email/#text "[email protected]" 

然後你就可以推出:

$ chmod +x user.augtool 
$ ./user.augtool --transform "Xml.lns incl /users.xml" -r . 
Saved 1 file(s) 
+0

謝謝!一個評論,但我不能保存XML文件,如果它已被加載的命令:augtool -r。 --noautoload --transform「Xml.lns incl /users.xml」 我正在使用augeas版本1.0.0 – PapelPincel

+0

什麼是錯誤,如果有的話? –

+1

沒有錯誤,我不在最後打印消息「保存1個文件」,文件未被修改。 我有另一個問題,但這次與傀儡資源類型在Puppet(http://stackoverflow.com/questions/21384569/why-does-augeas-puppet-resource-type-need-3-arguments-for-defnode) 。如果你有任何想法,這將是偉大的:) 謝謝 – PapelPincel