我无法从文件中读取并指定一些if / else条件。我会尽力解释我的目标和我面临的问题。我正在处理应用程序的XML文件,我已将XML解析为TSV。现在我已经阅读了TSV文件并且我已经完成了所有菜单,当我完成子菜单时,我必须返回主菜单并转到下一个并继续这样做。这是应用程序的树视图:
1 -> Main Menu
2 -> Broadband
3 -> Load and Save Profiles
4 -> Load Profile
5 -> Save Profile
6 -> Delete Profile
7 -> Interface
8 -> xDSL
10 -> Ethernet
11 -> SHDSL
12 -> xDSL Interface
13 -> xDSL Mode
14 -> MAC Address
15 -> Vectoring Mode
16 -> G.FAST
17 -> Auto Re-Sync
18 -> Seamless Rate Adaption
19 -> G.INP
20 -> Power Cut Back
21 -> ATM Type
22 -> Voip Interface ATM Type
23 -> Iptv Interface ATM Type
24
25 -> Ethernet Interface
26 -> Autonegotiation
27 -> Speed
28 -> Duplex Mode
29 -> SHDSL Interface
30 -> SHDSL Service
31 -> Side
32 -> Line Mapping
33 -> Bonding
34 -> Line Parameter
这是原始的XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<ke3600-menu-file language="en" display="English" index="1">
<version major="0" minor="1" patch="0"/>
<locale name="en_EN" timezone="CET-1CEST,M3.5.0,M10.5.0/3"/>
<menu name="main_menu" display="Main Menu">
<menu name="broadband" display="Broadband" help="100_help_broadband">
<onenter proc="activateGfast"/>
<menu name="load_save_profiles" display="Load and Save Profiles" help="601_help_profiles">
<application name="load_profiles" display="Load Profile"/>
<application name="save_profiles" display="Save Profile"/>
<application name="remove_profiles" display="Delete Profile"/>
</menu>
<parameter type="list" name="wanInterface" display="Interface" help="101_help_wanInterface">
<value id="0" name="ifDSL" display="xDSL"/>
<value id="1" name="ifSFP" display="SFP"/>
<value id="2" name="ifETH" display="Ethernet"/>
<!-- <value i d="3" name="ifWLAN" display="WLAN"/> -->
<value id="4" name="ifSHDSL" display="SHDSL"/>
</parameter>
<menu name="xdslinterface" display="xDSL Interface" help="200_help_xDslInterface">
<parameter type="list" name="annex" display="xDSL Mode" help="201_help_xdslModi">
<value id="0" name="xdsl_line_annex_a" display="Annex A/M"/>
<value id="1" name="xdsl_line_annex_b" display="Annex B/J"/>
</parameter>
<application name="xdsl_macAddr" display="MAC Address" caption="MAC Address">
<param type="string" name="xdsl_mac_addr" display="MAC Address" length="25"/>
</application>
<parameter type="list" name="xdsl_vectoring_mode" display="Vectoring Mode" help="202_help_Vectoring">
<value id="0" name="xdsl_vectoring_mode_disabled" display="Disabled"/>
<value id="1" name="xdsl_vectoring_mode_enabled" display="Enabled"/>
<value id="2" name="xdsl_vectoring_mode_friendly" display="Friendly"/>
</parameter>
<parameter type="list" name="xdsl_gfast_mode" display="G.FAST">
<value id="0" name="xdsl_gfast_mode_disabled" display="Disabled"/>
<value id="1" name="xdsl_gfast_mode_enabled" display="Enabled"/>
</parameter>
<parameter type="list" name="resync" display="Auto Re-Sync">
<value id="1" name="re_sync_on" display="On"/>
<value id="0" name="re_sync_off" display="Off"/>
</parameter>
<parameter type="list" name="seamlessRateAdaption" display="Seamless Rate Adaption">
<value id="0" name="sra_off" display="Off"/>
<value id="1" name="sra_on" display="On"/>
</parameter>
<parameter type="list" name="xdsl_ginp" display="G.INP">
<value id="0" name="xdsl_ginp_none" display="Off"/>
<value id="1" name="xdsl_ginp_down" display="Down"/>
<value id="2" name="xdsl_ginp_up" display="Up"/>
<value id="3" name="xdsl_ginp_both" display="Down/Up"/>
</parameter>
<parameter type="list" name="power_cut_back" display="Power Cut Back">
<value id="0" name="power_cut_back_off" display="Off"/>
<value id="1" name="power_cut_back_on" display="On"/>
</parameter>
<parameter type="list" name="atmType" display="ATM Type">
<value id="0" name="atm_type_aal5" display="AAL5"/>
<value id="1" name="atm_type_aal0pkt" display="AAL0PKT"/>
<value id="2" name="atm_type_aal0cell" display="AAL0CELL"/>
</parameter>
<parameter type="list" name="voip_atmType" display="Voip Interface ATM Type">
<value id="0" name="voip_atm_type_aal5" display="AAL5"/>
<value id="1" name="voip_atm_type_aal0pkt" display="AAL0PKT"/>
<value id="2" name="voip_atm_type_aal0cell" display="AAL0CELL"/>
</parameter>
<parameter type="list" name="iptv_atmType" display="Iptv Interface ATM Type">
<value id="0" name="iptv_atm_type_aal5" display="AAL5"/>
<value id="1" name="iptv_atm_type_aal0pkt" display="AAL0PKT"/>
<value id="2" name="iptv_atm_type_aal0cell" display="AAL0CELL"/>
</parameter>
</menu>
<menu name="ethernetinterface" display="Ethernet Interface" help="300_help_ethernetInterface">
<parameter type="list" name="ethInterfaceAuto" display="Autonegotiation">
<value id="1" name="ethInterfaceAutoOn" display="On"/>
<value id="0" name="ethInterfaceAutoOff" display="Off"/>
</parameter>
<parameter type="list" name="ethInterfaceSpeed" display="Speed">
<value id="2" name="ethIf1000" display="1000MBit/s"/>
<value id="1" name="ethIf100" display="100MBit/s"/>
<value id="0" name="ethIf10" display="10MBit/s"/>
</parameter>
<parameter type="list" name="ethInterfaceDuplexMode" display="Duplex Mode">
<value id="1" name="ethIfFull" display="Full"/>
<value id="0" name="ethIfHalf" display="Half"/>
</parameter>
</menu>
我可以浏览菜单和子菜单,然后返回主菜单直到第6行。之后我正在努力做什么。问题出在第7行,当用户选择xDSL
类型时,他应该跳转到菜单xDSL interface
(第12行),然后当他完成所有子菜单{{ 1}}他应该返回到第10行并选择xDSL Interface
类型,然后向前跳到第25行并选择Ethernet
然后再次使用{{1}的所有子菜单他应该回到第11行,然后选择Ethernet Interface
并做之前的事情。
所以这就是我想要做的。我正在读取TSV文件中的行,在读完一行并找到一个特定的字符串,例如:Ethernet Interface
后,我可以在此循环中启动一个嵌套循环来检查以下行并转到{{1像这样:
SHDSL
这里,在第7行找到xDSL
,然后在第12行找到xDSL Interface
时打破for循环,转到下一个if第12行的函数。但是当它断开并启动下一个if函数时它将从第8行恢复,它不会计算我在前一个if条件中嵌套循环中所做的行条。
另外我的下一个问题是,当我完成if list_title == "Interface":
for inner_record in testData.dataset(findFile("testdata","parsedXML.tsv")):
inner_label = testData.field(inner_record,"Label")
test.log("Running inner loop.")
if inner_label == "xDSL Interface":
break
else:
inner_label.strip()
if (here is the next if-loop that will work from the line where xDSL Interface was found)
的所有子菜单直到第23行时,我想跳回第10行到Interface
并找到此行,我想跳到第25行继续xDSL Interface
,就像之前一样。
我正在通过以下方式保留代码正在读取的文件行的计数:
xDSL Interface
我可以构建一个行开始位置列表(文件偏移),然后使用Ethernet
返回第n行(从零开始计数)。但问题是我必须将此Ethernet Interface
保留在if循环中,然后继续使用此循环之外的另一个if循环。但是我在那里遇到类似的问题,当我跳过线路或者想要返回时,在嵌套循环中它可以工作,但是如何从外部if循环继续?
我的目标:
我想制作一些嵌套的if循环,当文件读取for lineno, line in enumerate(f, start=1):
类型时,IF语句将搜索包含xDSL接口的行(第12行),然后继续读取直到所有子xDSL接口的菜单,然后if语句将返回到第10行,当它找到字符串file.seek(line_offsets[n])
时,它将搜索以太网接口并转到第25行并再次读取所有读取功能在以太网接口的子菜单中,他应该返回到第11行并搜索SHDSL并像以前一样。
如果有人想要问题的简短版本:
如何使用嵌套的if循环跳过python中的读取行,然后使用外部循环继续读取该高级行?另外如何使用嵌套的if-loop返回python中的前一行,然后使用外部循环继续读取前一行?