2015-11-13 66 views
1

我無法理解我應該如何訪問由PowerShell輸出的XML格式。我正在Python中用etree來做這件事。Python ETREE解析Windows XML輸出

的XML是這些繼承,我可以通過itering在根得到:

<Obj RefId="3"> 
    <TNRef RefId="0" /> 
    <ToString>CN=Guest,CN=Users,DC=xxx,DC=xx</ToString> 
    <Props> 
     <S N="DistinguishedName">CN=Guest,CN=Users,DC=xxx,DC=xx</S> 
     <B N="Enabled">false</B> 
     <Nil N="GivenName" /> 
     <Obj N="MemberOf" RefId="4"> 
     <TNRef RefId="1" /> 
     <LST> 
      <S>CN=Guests,CN=Builtin,DC=xxx,DC=xx</S> 
     </LST> 
     </Obj> 
     <S N="Name">Guest</S> 
     <S N="ObjectClass">user</S> 
     <G N="ObjectGUID">xxxxxxx-xxxx-xxxx-xxxx-xxxxxx</G> 
     <S N="SamAccountName">Guest</S> 
     <Obj N="SID" RefId="5"> 
     <TNRef RefId="2" /> 
     <ToString>S-1-5-21-1111111-11111-111111111-111</ToString> 
     <Props> 
      <I32 N="BinaryLength">28</I32> 
      <S N="AccountDomainSid">S-2-2-2-22222-222-22222</S> 
      <S N="Value">S-2-2-22-2222222-222222-22222-2222</S> 
     </Props> 
     </Obj> 
     <Nil N="Surname" /> 
     <Nil N="UserPrincipalName" /> 
    </Props> 
    </Obj> 

我能夠做去的「道具」元素:

tree = etree.parse(file) 
    root = tree.getroot() 
    props = root.find('Props') 

現在讓我們說我想獲得「SamAccountName」,我不明白如何達到它。如果我打印的元素的鍵,我得到非唯一鍵:

['N'] 
['N'] 
['N'] 
['RefId', 'N'] 
['N'] 
['N'] 
['N'] 
['N'] 
['RefId', 'N'] 
['N'] 
['N'] 

的項目方法給我元組,它看起來像唯一標識符我後:

[('N', 'DistinguishedName')] 
[('N', 'Enabled')] 
[('N', 'GivenName')] 
[('RefId', '4'), ('N', 'MemberOf')] 
[('N', 'Name')] 
[('N', 'ObjectClass')] 
[('N', 'ObjectGUID')] 
[('N', 'SamAccountName')] 
[('RefId', '5'), ('N', 'SID')] 
[('N', 'Surname')] 
[('N', 'UserPrincipalName')] 

我嘗試了沿線的一堆不同的東西:

props.find('{N}SamAccountName') 
props.find('S N="SamAccountName"') 

但是,如果找不到任何東西。我可以得到與實際值的唯一方法是:

chicken = props[7] 
print(chicken.text) 

我敢肯定有一個更強大的方式來獲得,但我無法找到正確的方法。

回答