2016-08-12 10 views
0

私はPythonを初めて使い、タスクを自動化しようとしています。私は2日かけてドキュメントを読んで、他の同様の質問に目を通しましたが、今は壁に衝突して前進できません。ElementTreeを使ってXMLタグの属性値を解析し、値の文字列を置き換えます。

私は、PythonドキュメントがElementtreeモジュールで十分に文書化されていないと感じています。多分それは私だけです。また、私は他のモジュールを使用できることを知っています。しかしElementtreeだけで私を指示してください。私は手伝ってください。

このタスクは、XMLを解析し、Elementtreeを使用してすべてのタグの属性値を置き換えることです。 web-server-parmでは、「http://api-stg.link.com」を含むすべてのリンクを置き換える必要があります。元については...

FROM

"SERVERADDR =" http://api-stg.link.com/dataapi/v2/exchangerates/ "

TO" ServerAddr = "http://api-DATA-stg.link.com/dataapi/v2/exchangerates/"

のXMLのtest.xml

<?xml version="1.0" encoding="utf-8"?> 
<ConfigRoot> 
    <max-layer layer="5"/> 
    <enabled-cache status="0"/> 
    <server type="fgrfreefr"> 
    <web-server-parm mode="QA" ServerAddr="http://api-stg.link.com/dataapi/v2/securities?response=complex&amp;limit=9999999" timedOut="10000" X-API-UserId="54456464561" X-API-ProductId="ADS" ApiKey="fgggdfvdffdgdfg"/> 
    <web-server-parm mode="UAT" ServerAddr="http://api-uat.link.com/dataapi/v2/securities?response=complex&amp;limit=9999999" timedOut="10000" X-API-UserId="gdfsgvhdgjfjuhgdyejhgsfegtb" X-API-ProductId="ADS" ApiKey="@[email protected]"/> 
    </server> 
    <server type="vfffdg"> 
    <web-server-parm mode="QA" ServerAddr="http://api-stg.link.com/dataapi/v2/exchangerates/" timedOut="10000" X-API-UserId="gsfsftfdfrfefrferf" X-API-ProductId="ADS" ApiKey="fgvdgggdfgttggefr"/> 
    <web-server-parm mode="UAT" ServerAddr="http://api-uat.link.com/dataapi/v2/exchangerates/" timedOut="10000" X-API-UserId="gdfdagtgdfsgtrsdfsg" X-API-ProductId="ADS" ApiKey="@hdvfddfdd"/> 
    </server> 
</ConfigRoot> 

Task.py これは私がこれまで

import xml.etree.ElementTree as ET 
# import XML, SubElement, Element, tostring 

#---------------------------------------------------------------------- 
def parseXML(xml_file): 
    """ 
    Parse XML with ElementTree 
    """ 
    tree = ET.ElementTree(file=xml_file) 
    root = tree.getroot() 

    # get the information via the children! 

    print "Iterating using getchildren()" 

    node = root.getchildren() 
    for server_addr in node: 
     node_children = server_addr.getchildren() 
     for node_child in node_children: 
      print "_________passed__________" 
      print "%s=%s" % (node_child.attrib, node_child.text) 
      test = node_child.findtext("http://api-stg.link.com/dataapi/v2/exchangerates/") 
      if test is None: 
       continue 
      tests = test.text 
      print tests 

# #---------------------------------------------------------------------- 
if __name__ == "__main__": 
    parseXML("test/test.xml") 
+0

あなたは文字通り交換する 'SERVERADDR = "のhttp:// api-stg.link.com/dataapi/V2/exchangerates/'SERVERADDR ='と" のhttp:// API -DATA-stg.link.com/dataapi/v2/exchangates/'?もしそうなら、あなたは単に置き換えを行うことを考えることができます: 'new_xml.replace( 'ServerAddr =" http://api-stg.link.com/dataapi/v2/exchangerates/ "、" ServerAddr = "http:// api- DATA-stg.link.com/dataapi/v2/exchangerates/ ') ' – Karin

答えて

1

は、要素間でiter()の使用を検討しているものである条件ifと置き換えます

import xml.etree.ElementTree as ET 

#---------------------------------------------------------------------- 
def parseXML(xml_file): 
    """ 
    Parse XML with ElementTree 
    """ 
    tree = ET.ElementTree(file=xml_file) 
    root = tree.getroot() 

    # get the information via the children! 
    print("Iterating using getchildren()") 

    for serv in root.iter('server'): 
     for web in serv.iter('web-server-parm'): 
       if 'http://api-stg.link.com' in web.get('ServerAddr'): 
        web.set('ServerAddr', web.get('ServerAddr').\ 
         replace("http://api-stg.link.com", "http://api-DATA-stg.link.com")) 

    print(ET.tostring(root).decode("UTF-8")) 

    tree.write("ConfigRoot_py.xml") 

# #---------------------------------------------------------------------- 
if __name__ == "__main__": 
    parseXML("ConfigRoot.xml") 

出力

<ConfigRoot> 
    <max-layer layer="5" /> 
    <enabled-cache status="0" /> 
    <server type="fgrfreefr"> 
    <web-server-parm ApiKey="fgggdfvdffdgdfg" ServerAddr="http://api-DATA-stg.link.com/dataapi/v2/securities?response=complex&amp;limit=9999999" X-API-ProductId="ADS" X-API-UserId="54456464561" mode="QA" timedOut="10000" /> 
    <web-server-parm ApiKey="@[email protected]" ServerAddr="http://api-uat.link.com/dataapi/v2/securities?response=complex&amp;limit=9999999" X-API-ProductId="ADS" X-API-UserId="gdfsgvhdgjfjuhgdyejhgsfegtb" mode="UAT" timedOut="10000" /> 
    </server> 
    <server type="vfffdg"> 
    <web-server-parm ApiKey="fgvdgggdfgttggefr" ServerAddr="http://api-DATA-stg.link.com/dataapi/v2/exchangerates/" X-API-ProductId="ADS" X-API-UserId="gsfsftfdfrfefrferf" mode="QA" timedOut="10000" /> 
    <web-server-parm ApiKey="@hdvfddfdd" ServerAddr="http://api-DATA-stg.link.com/dataapi/v2/exchangerates/" X-API-ProductId="ADS" X-API-UserId="gdfdagtgdfsgtrsdfsg" mode="UAT" timedOut="10000" /> 
    </server> 
</ConfigRoot> 
+0

ありがとうございます@パーフェクト!しかし、私はリンクのバリエーションがある巨大なXMLを持っています。私は、「為替レート」とhttpリンクを編集するだけでなく、「有価証券」も編集したいと考えています。 –

+0

現在の出力では、サーバーの2番目のブロックのみが変更されます。 –

+0

あなたの投稿では、投稿したXMLに一度しか表示されない、http:// api-stg.link.com/dataapi/v2/exchangates/'のみを置き換えて指定しました。 – Parfait

関連する問題