2017-05-20 10 views
0

から情報を抽出し(私はそれを少し短くしましたが、それはまだ巨大ですので、私はリンクとしてそれを置く:私は何をしたいかhttps://ghostbin.com/paste/rbu9tパイソン - これは私のplist/xmlですPLIST/XML

があります

appIdentifier
classNameの
機能 < ---関数は= "表示名" の後に

ラインは、私が今持っているもの:。のようなフィールドを抽出0

しかし、パターンを続けると、間違ったものが抽出されます。

私は次のものに行く前に、各アプリケーションのすべての関数とクラス名をextarctできます。

それが可能ならば、すべてのクラスと関数を抽出できますが、1つのアプリケーションの情報しか持たないplist/xmlが必要です。

OLD QUESTION: I'm coding a program, but as you can see, I'm doing +6 then +1, then +6, then +1. Is there a way to automate this (some program or site) or some code to help me? Cheers!

私のコード:(*注:各アプリは、クラスや関数の異なる量を持つことができるので、数パターンは本当に、私は思ったほど多くを助けにはなりません

import xml.dom.minidom 

xml = xml.dom.minidom.parse('my.plist') 

Document = xml.getElementsByTagName('plist') 



for key in Document: 
    desc = key.getElementsByTagName('string')[5].firstChild.data 
    desc1 = key.getElementsByTagName('string')[6].firstChild.data 

print('Class: ', desc, 'Function: ', desc1) 


desc = key.getElementsByTagName('string')[11].firstChild.data 
desc1 = key.getElementsByTagName('string')[12].firstChild.data 

print('Class: ', desc, 'Function: ', desc1) 


desc = key.getElementsByTagName('string')[17].firstChild.data 
desc1 = key.getElementsByTagName('string')[18].firstChild.data 

print('Class: ', desc, 'Function: ', desc1) 

desc = key.getElementsByTagName('string')[23].firstChild.data 
desc1 = key.getElementsByTagName('string')[24].firstChild.data 

print('Class: ', desc, 'Function: ', desc1) 


desc = key.getElementsByTagName('string')[29].firstChild.data 
desc1 = key.getElementsByTagName('string')[30].firstChild.data 

print('Class: ', desc, 'Function: ', desc1) 

申し訳ありませんならば。ポストは非常に詳細ではないか、説明し、あなたは私が私ができる良いとしてそれらをお答えします質問!

+0

あなたのインデントはほとんど意味がありません。それを修正してください。 –

+0

ところで、実際にここで数値インデックスを作成する理由があるのであれば、私は非常に驚いています。入力XMLの実際のフォーマットが与えられていれば、相対的なオフセットは、将来的に変更されても機能します。 –

+0

@CharlesDuffy私はそう願っています!今すぐ投稿を更新しよう! :) – CandyGum

答えて

0

これは、XPathをサポートする最新のXMLライブラリではるかに簡単です。したがって、私は以下のlxmlを使用しています。

import lxml.etree as etree 
import sys 

doc = etree.parse(open(sys.argv[1])) 
for app_dict in doc.xpath('/plist/dict/array/dict'): 
    appId = app_dict.xpath('./key[.="appIdentifier"]/following-sibling::string[1]/text()')[0] 
    for method_dict in app_dict.xpath('.//dict[key="methodObjc"]/dict'): 
     classId = method_dict.xpath('./key[.="className"]/following-sibling::string[1]/text()')[0] 
     methodId = method_dict.xpath('./key[.="displayName"]/following-sibling::string[1]/text()')[0] 
     print 'App: %s; Class: %s; Method: %s' % (appId, classId, methodId) 

全出力は次のようになります。

App: com.apprizon.follow4followapp; Class: IBInAppPurchasesManager; Method: -(bool) isPremium 
App: com.apprizon.follow4followapp; Class: IBRedeemCodeView; Method: -(unsigned long long) reward 
App: com.apprizon.follow4followapp; Class: IBGetFollowersGoldenFollowersCell; Method: -(void) setFreeFollowers:(long long) 
App: com.apprizon.follow4followapp; Class: IBGetFollowersGoldenFollowersCell; Method: -(long long) freeFollowers 
App: com.apprizon.follow4followapp; Class: IBSettings; Method: -(double) extraRewardForPro 
App: com.apprizon.follow4followapp; Class: IBSettings; Method: -(void) setReferralMinReward:(long long) 
App: com.apprizon.follow4followapp; Class: IBSettings; Method: -(long long) referralMinReward 
App: com.apprizon.follow4followapp; Class: IBSettings; Method: -(void) setRewardForSecondaryAccount:(long long) 
App: com.apprizon.follow4followapp; Class: IBSettings; Method: -(long long) rewardForSecondaryAccount 
App: com.apprizon.follow4followapp; Class: IBSettings; Method: -(void) setExtraRewardForPro:(double) 
App: com.apprizon.follow4followapp; Class: IBMe; Method: -(unsigned long long) availableSpins 
App: com.apprizon.follow4followapp; Class: IBMe; Method: -(bool) canRedeemCode 
App: com.apprizon.follow4followapp; Class: IBMe; Method: -(void) setCanRedeemCode:(bool) 
App: com.apprizon.follow4followapp; Class: IBSettings; Method: -(bool) wofFreeSpinsEnabled 
App: com.apprizon.follow4followapp; Class: IBSettings; Method: -(void) setWofFreeSpinsEnabled:(bool) 
App: com.apprizon.follow4followapp; Class: IBWheelOfFortuneView; Method: -(long long) numberOfFreeSpins 
App: com.apprizon.follow4followapp; Class: IBWheelOfFortuneView; Method: -(void) setNumberOfFreeSpins:(long long) 
App: com.apprizon.follow4followapp; Class: IBWheelOfFortunePrizeView; Method: -(bool) freeSpinAvailable 
App: com.apprizon.follow4followapp; Class: IBWheelOfFortunePrizeView; Method: -(void) setFreeSpinAvailable:(bool) 
App: com.apprizon.follow4followapp; Class: IBWheelOfFortuneManager; Method: -(bool) freeSpinAvailable 
App: com.apprizon.follow4followapp; Class: IBMiniGame; Method: -(void) setPrize:(id) 
App: com.apprizon.follow4followapp; Class: IBMiniGame; Method: -(id) prize 
App: com.apprizon.follow4followapp; Class: IBSettings; Method: -(unsigned long long) maxEnergyDefault 
App: com.apprizon.follow4followapp; Class: IBSettings; Method: -(void) setMaxEnergyDefault:(unsigned long long) 
App: com.betternet; Class: BetternetUser; Method: -(bool) isPremium 
App: com.betternet; Class: BetternetUser; Method: -(void) setIsPremium:(bool) 
App: com.betternet; Class: BetternetUser; Method: -(bool) allowedPremium 
App: com.betternet; Class: GADDevice; Method: -(bool) jailbroken 
App: com.betternet; Class: FlurryUtil; Method: +(BOOL) deviceIsJailbroken 
App: co.allconnected.vpnmaster; Class: FlurryUtil; Method: +(BOOL) deviceIsJailbroken 
App: com.anchorfree.hss; Class: ZDKUser; Method: -(bool) isAgent 
App: com.anchorfree.hss; Class: AFUserAccount; Method: -(void) setAuto_renew:(bool) 
App: com.anchorfree.hss; Class: AFUserAccount; Method: -(bool) auto_renew 
App: com.anchorfree.hss; Class: AFUserAccount; Method: -(void) setIsValid:(bool) 
App: com.apprizon.follow4followapp; Class: IBInAppPurchasesManager; Method: -(bool) isPremium 
App: com.alphaweb.fairyfail; Class: IBBearGood; Method: -(float) speed 
App: com.alphaweb.fairyfail; Class: GameScene; Method: -(int) totalNumberOfStars 
App: com.alphaweb.fairyfail; Class: BalloonSprite; Method: -(float) speed 
App: com.alphaweb.fairyfail; Class: GameScene; Method: -(BOOL) rateMenuShouldBeDisplayed 
App: com.alphaweb.fairyfail; Class: GameScene; Method: -(BOOL) isSpiderExist 
App: com.alphaweb.fairyfail; Class: IBBearBomb; Method: -(BOOL) isBomb 
App: com.intsig.CamScannerHDPro; Class: CSDataCenter; Method: +(bool) isPremiumAccount 
App: com.intsig.CamScannerHDPro; Class: CSLoggedinViewController; Method: -(bool) isPremiumAccount 
App: com.intsig.CamScannerHDPro; Class: ENSession; Method: -(bool) isPremiumUser 
App: com.intsig.CamScannerHDPro; Class: CSSettings; Method: +(bool) isPremiumFeatureAvailable 
App: com.intsig.CamScannerHDPro; Class: CSStoreManager; Method: -(int) faxBalance 
App: com.intsig.CamScannerHDPro; Class: CSStoreManager; Method: -(void) setFaxBalance:(int) 
App: com.intsig.CamScannerHDPro; Class: CSStoreManager; Method: -(bool) canSendFax 
App: com.intsig.CamScannerHDPro; Class: CSStoreManager; Method: -(void) setCanSendFax:(bool) 
App: com.intsig.CamScannerHDPro; Class: CSHDAppDelegate; Method: -(void) collectInfos 
+0

私はこのエラーを受け取ります: doc = lxml。 etl.parse(open(sys.argv [1])) NameError:名前 'lxml'が定義されていません。 – CandyGum

+0

おっと - 申し訳ありません、ただ 'etree.parse'です。 –

+0

それを修正しました:) 今すぐ入手しました 'doc = etree.parse(open(sys。argv [1])) IndexError:リストインデックスが範囲外です。 ' また、ファイル名はどこに入力しますか? – CandyGum

1
x = 5 
for key in Document: 
    desc = key.getElementsByTagName('string')[x].firstChild.data 
    desc1 = key.getElementsByTagName('string')[x+1].firstChild.data 
    print('Class: ', desc, 'Function: ', desc1) 
    x += 5 

を持っている場合は、コードスニペットの上に試すことができ、これは

を役に立てば幸い
+0

で見つけた場合は、正しい答えとして受け入れてください。 – pramod

関連する問題