2011-12-19 4 views
0

タイトルの誤解をおかけして申し訳ありませんが、小さなタイトルで問題を説明できませんでした。それは大きな問題ではありませんが、とにかく混乱します。異なるタイプの属性を印刷し、グループ要素で選択したタイプのすべてのApp要素をPythonで一覧表示する

電流出力:

1) Deployment 
2) Service Status 
3) List Servers 
4) Restart Service 
5) Restart Server 
6) Execute Commands on Servers 
Make your choice: 4 

1) Group 
2) Single Machine 
Group or Single Machine?: 1 

1) The Perfect Life 
Which group?: 1 

1) Tomcat 
1) JBoss 
2) Tomcat 
1) JBoss 
2) Tomcat 
1) JBoss 
Select a service: --????--* 

XML:私は何をしたいのか、そう

if GroupList: 
    for App in Group.getElementsByTagName('App'): 
     print App.getAttribute('id')+") "+App.getAttribute('type') 

    sList = raw_input("Select a service: ") 
    App = Group.getElementsByTagName('App')[int(sList)-1] 

    print (' ') 

    if sList: 
      x = App.getAttribute('state') 
      stype = App.getAttribute('type') 
      trigger = 0 

      while trigger < 1: 
       if x == 'ok': 
        try: 
         getDeployPath = App.getAttribute('path') 
         sIP = Server.getAttribute('ip') 
         sUSER = Server.getAttribute('username') 
         sPASS = Server.getAttribute('password') 

         if not sUSER: 
          sUSER = Group.getAttribute('username') 

         if not sPASS: 
          sPASS = Group.getAttribute('password') 

         dssh = paramiko.SSHClient() 
         dssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
         dssh.connect(sIP, username=sUSER, password=sPASS) 

And it goes... 
... 
... 

<Group id="1" name="The Perfect Life" 
     username="root" password="mypasswd123" state="ok"> 

     <Server id="1" name="Machine (250)" ip="192.168.1.250" username="" password="" state="ok"> 
      <App id="1" type="Tomcat" state="ok" /> 
     </Server> 

     <Server id="2" name="Machine (251)" ip="192.168.1.251" username="" password="" state="ok"> 
      <App id="1" type="JBoss" path="" state="ok" /> 
      <App id="2" type="Tomcat" path="" state="ok" /> 
     </Server> 

     <Server id="3" name="Machine (252)" ip="192.168.1.252" username="" password="" state="ok"> 
      <App id="1" type="JBoss" path="" state="ok" /> 
      <App id="2" type="Tomcat" path="" state="ok" /> 
     </Server> 

     <Server id="4" name="Machine (253)" ip="192.168.1.253" username="" password="" state="ok"> 
      <App id="1" type="JBoss" path="" state="ok" /> 
     </Server> 

    </Group> 

コード官能化されてない "サービスを選択し、" 一部を取得するには?

1)私は、TomcatとJBossを印刷します(または新しいアプリケーションをXMLに追加して印刷するときに)簡単に異なるタイプを印刷します。

2)選択後、すべてグループサーバの下にある選択したサービスタイプのすべてのアプリケーションタグを選択します。私はもっ​​と多くのグループを追加します。

私はすべてを自分で試しました。キーでそれらをグループ化しようとしましたが、選択後に私は立ち往生しています。

注:私はPythonのデフォルトのミニドームライブラリを使用しています。 lxmlなどではありません。

おかげ

答えて

1

私はあなたが求めているものについて少し困惑しています。私はあなたのXMLスキーマも混乱しています。

しかし、XPATHに慣れ親しむことをおすすめします。私の好みのXMLライブラリはlxmlです。

xpath expressionsを使用してXMLデータを照会することができます。最大の注意点は、XMLが目的のデータモデルに準拠していない可能性があることです。 XMLスキーマへの準拠を強制したり、手動によるエラーチェックをたくさん行う必要があります。

ここでは、XPlob式を使用してXMLブロブを照会する簡単な(入力チェックなしの)例を示します。私はidでグループを選択するんだけど、あなたはすべてのグループ間で選択したい場合は、グループの後に述語を残すことができる:

from lxml import etree 
doc = etree.XML(""" 
<Group id="1" name="The Perfect Life" 
    username="root" password="mypasswd123" state="ok"> 
    <Server id="1" name="Machine (250)" ip="192.168.1.250" username="" password="" state="ok"> 
     <App id="1" type="Tomcat" state="ok" /> 
    </Server> 
    <Server id="2" name="Machine (251)" ip="192.168.1.251" username="" password="" state="ok"> 
     <App id="1" type="JBoss" path="" state="ok" /> 
     <App id="2" type="Tomcat" path="" state="ok" /> 
    </Server> 
    <Server id="3" name="Machine (252)" ip="192.168.1.252" username="" password="" state="ok"> 
     <App id="1" type="JBoss" path="" state="ok" /> 
     <App id="2" type="Tomcat" path="" state="ok" /> 
    </Server> 
    <Server id="4" name="Machine (253)" ip="192.168.1.253" username="" password="" state="ok"> 
     <App id="1" type="JBoss" path="" state="ok" /> 
    </Server> 
</Group> 
""") 

# group id from user 
group_id = "1" 
# unique apps under group_id 
app_types = set(doc.xpath('//Group[@id=$group_id]/descendant::App/@type',group_id=group_id)) 
app_dict = dict((x+1,y) for (x,y) in enumerate(app_types)) 

print "Apps:\n\t" + "\n\t".join("%d) %s" % x for x in sorted(app_dict.items())) 
app_selection = input("Select a service: ") 
app_type = app_dict.get(int(app_selection)) 

# Servers in group_id with app_type 
for server in doc.xpath('//Group[@id=$group_id]/Server[./App[@type=$app_type]]',group_id=group_id,app_type=app_type): 
    print etree.tostring(server) # Don't know what you want to do per-server... 

収量:

Apps: 
     1) JBoss 
     2) Tomcat 
Select a service: 1 

<Server id="2" name="Machine (251)" ip="192.168.1.251" username="" password="" state="ok"> 
     <App id="1" type="JBoss" path="" state="ok"/> 
     <App id="2" type="Tomcat" path="" state="ok"/> 
    </Server> 

<Server id="3" name="Machine (252)" ip="192.168.1.252" username="" password="" state="ok"> 
     <App id="1" type="JBoss" path="" state="ok"/> 
     <App id="2" type="Tomcat" path="" state="ok"/> 
    </Server> 

<Server id="4" name="Machine (253)" ip="192.168.1.253" username="" password="" state="ok"> 
     <App id="1" type="JBoss" path="" state="ok"/> 
    </Server> 
+0

私はlxmlのに慣れていないよ、私はPythonのデフォルトのxml.minidomを使用しています。私のXMLスキーマはこのように最高です。木として。サーバーグループの最初のタグ。指定されたグループ内のサーバーの2番目のタグ。また、サーバーの下で実行されているアプリケーションのAppタグ。私は本当に人々が私の質問を理解していない方法を理解していない。それは非常に簡単な質問です。もう一度説明しましょう:私は2つの焦点にある。そのうちの1つ、指定されたグループのすべてのApp Elementsを選択します。 (例として、「The Perfect Life」の「すべてのApp Elements」)、さまざまなAppタイプが印刷されます。 (JBossとTomcat [For Now]) – nightrider84

+0

Second Focus:選択した後(E.G. JBoss)指定グループ内のすべてのJBoss用App Elementsを印刷します(「Perfect Life」のすべてのJBoss Attributed App Elements)。 @MattH – nightrider84

+0

まあ、私のソリューションは、あなたが求めたことを行うと思う – MattH

関連する問題