【发布时间】:2021-06-04 17:54:56
【问题描述】:
我有几百个 oracle 表单,我将它们转换为 XML。我想提取任何可能对我有用的文本(值),以检查我拥有的所有表单之间的某些相互依赖关系。
我尝试将它们插入数据库中的完整 XML 格式的表中,但挑战是表的大小相当大,查询该表大约需要 10 分钟。
因此,我想从 XML 格式中删除所有不必要的文本,只保留所需的内容。
你有什么建议?我正在使用 python 和有用的信息形式,我将像块名称,写在 oracle 形式中的任何程序(在程序单元标记中)
另外,请注意我的 Oracle XML 格式是:
<?xml version = '1.0' encoding = 'UTF-8'?>
<Module version="111020200" xmlns="http://xmlns.oracle.com/Forms">
<FormModule Name="TEST" DirtyInfo="true" Title="MODULE1" MenuModule="DEFAULT&SMARTBAR" ConsoleWindow="WINDOW1">
<Coordinate CharacterCellWidth="5" DefaultFontScaling="true" CoordinateSystem="Real" CharacterCellHeight="14" RealUnit="Point"/>
<Block Name="BLOCK2" DirtyInfo="true" ScrollbarWidth="9" ScrollbarLength="135">
<Item Name="ROUND_RULE" Prompt="round rule" YPosition="143" TabPageName="" XPosition="110" DirtyInfo="true" Width="45" PromptAttachmentOffset="11" PromptAlignOffset="1" CanvasName="CANVAS5" Height="14"/>
<Item Name="ROUND_PREM" MaximumLength="28" YPosition="143" XPosition="215" DataType="Number" Prompt="round prem" TabPageName="" DirtyInfo="true" PromptAttachmentOffset="7" Width="102" PromptAlignOffset="1" CanvasName="CANVAS5" Height="14"/>
<Item Name="ITEM7" YPosition="178" TabPageName="" Label="return" XPosition="142" DirtyInfo="true" Width="45" CanvasName="CANVAS5" Height="14" ItemType="Push Button">
<Trigger Name="WHEN-BUTTON-PRESSED" TriggerText=":value := ffn_round_premium(:Round_rule,:Round_Prem);" DirtyInfo="true"/>
</Item>
<Item Name="VALUE" MaximumLength="28" YPosition="209" XPosition="145" DataType="Number" Prompt="value" TabPageName="" DirtyInfo="true" PromptAttachmentOffset="5" Width="97" PromptAlignOffset="2" CanvasName="CANVAS5" Height="14"/>
</Block>
<Canvas Name="CANVAS5" ViewportHeight="324" ViewportWidth="360" DirtyInfo="true" Width="360" Height="324" WindowName="WINDOW1"/>
<ProgramUnit Name="FFN_ROUND_PREMIUM" ProgramUnitType="Function" ProgramUnitText="Function ffn_round_premium (P_Round_rule in varchar2,P_Rounded_Prem number) &#10;RETURN NUMBER IS&#10; Cursor cr_round_premium is select v_calculation_type,v_round_needed,v_decimal_side,&#10; n_round_digits,v_round_method,n_round_to ,&#10; v_first_cut_digit_check &#10; from Gnlu_calc_rounding_rules &#10; where v_round_rule_ref = p_round_rule; &#10; Lv_cal_type varchar2(10);	&#10; Lv_round_needed varchar2(1);	 &#10; Lv_decimal_side varchar2(10); &#10; Ln_round_digits number; &#10; Lv_round_method varchar2(10); &#10; Ln_round_to number; &#10; Lv_first_cut_digit_check varchar2(1); &#10; Ln_last_digit number; &#10; Ln_previous_digit number;&#10; ln_rounded_prem number := 0; &#10; ln_prem number := 0;&#10; ln_first_value number := 0;&#10; ln_temp number := 0;&#10; lv_temp varchar2(50); &#10;begin &#10; open cr_round_premium ;&#10; fetch cr_round_premium into Lv_cal_type,&#10; Lv_round_needed,&#10; Lv_decimal_side,&#10; Ln_round_digits, &#10; Lv_round_method,&#10; Ln_round_to,&#10; Lv_first_cut_digit_check;&#10; close cr_round_premium; &#10; /*Round_needed = NO, then, the input value is returned back */ &#10; If lv_cal_type = 'P' then&#10;	 If Lv_round_needed ='N' then&#10;	 	 ln_prem := p_rounded_prem;&#10;	 elsif lv_round_needed = 'Y' then&#10;	 	 ln_rounded_prem := p_rounded_prem;&#10;	 ln_first_value := p_rounded_prem;&#10; If lv_decimal_side = 'B' and lv_first_cut_digit_check = 'N' then&#10; ln_rounded_prem := floor(ln_rounded_prem);&#10; if ln_round_digits = 0 then&#10; 	 ln_round_digits := 1;&#10; end if;	 &#10; elsif lv_decimal_side = 'A' and lv_first_cut_digit_check = 'N' then&#10;&#10;	 	 if floor(ln_rounded_prem) <> ln_rounded_prem then&#10;	 	 	 lv_temp := substr(ln_rounded_prem ,instr(ln_rounded_prem ,'.',1)+1) ; &#10;	 	 	 if substr(lv_temp,1,1) = 0 then&#10;	 	 	 	 lv_temp := 'ZERO';&#10;	 	 	 end if;	 &#10;			 ln_rounded_prem:= substr(ln_rounded_prem ,instr(ln_rounded_prem ,'.',1)+1) ; &#10;			 ln_rounded_prem := substr(ln_rounded_prem,1,ln_round_digits);&#10;			 	 elsif floor(ln_rounded_prem) = ln_rounded_prem then &#10;	 	 	 ln_rounded_prem := 0;&#10;			 	 end if;&#10;			 	 if ln_round_digits = 0 then&#10; 	 ln_round_digits := 1;&#10;			 	 end if;&#10;	 	 elsif lv_first_cut_digit_check = 'Y' and ln_round_digits = 0 then&#10;	 	 ln_rounded_prem := round(ln_rounded_prem);&#10;	 	 ln_prem := ln_rounded_prem;&#10;	 end if; &#10;	 &#10;	 if lv_decimal_side = 'A' and lv_round_method in ('F','C') and lv_first_cut_digit_check = 'N' and Ln_round_digits <> 0 then&#10;	 If ln_round_to = 5 and lv_round_method = 'F' then &#10;	 if substr(ln_rounded_prem,length(ln_rounded_prem),1) >= 5 then&#10;		 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-1) ||'5'; &#10;	 elsif substr(ln_rounded_prem,length(ln_rounded_prem),1) < 5 then &#10;	 	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-1) ||'0'; &#10;	 end if;	 &#10;	 End if;&#10;	 &#10;	 If ln_round_to = 5 and lv_round_method = 'C' then &#10;	 if lv_temp = 'ZERO'	 then&#10;	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-1)||'0'; 	&#10;	 else &#10;			 if substr(ln_rounded_prem,length(ln_rounded_prem),1) = 0 then&#10;			 	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-1)||'0'; &#10;			 elsif substr(ln_rounded_prem,length(ln_rounded_prem),1) > 0 and&#10;		 	 substr(ln_rounded_prem,length(ln_rounded_prem),1) <= 5 then&#10;		 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-1)||'5';&#10;				 elsif substr(ln_rounded_prem,length(ln_rounded_prem),1) > 5 and &#10;			 	 substr(ln_rounded_prem,length(ln_rounded_prem),1) <= 9 and&#10;			 	 Ln_round_digits <> 1 then &#10;			 	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-2)||substr(ln_rounded_prem,length(ln_rounded_prem)-1,1)+1||'0'; &#10;			 	 elsif substr(ln_rounded_prem,length(ln_rounded_prem),1) > 5 and &#10;			 	 substr(ln_rounded_prem,length(ln_rounded_prem),1) <= 9 and&#10;			 	 Ln_round_digits = 1 then&#10;			 	 ln_first_value := floor(ln_first_value)+ 1;&#10;			 	 ln_prem := 0; 	 &#10;			 	 end if;&#10;			 	 end if; &#10;	 End if;&#10;	 If ln_round_to = 0 and lv_round_method = 'F' then &#10;	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-1) ||'0'; &#10;	 End if;&#10;	 &#10;	 If ln_round_to = 0 and lv_round_method = 'C' then &#10;	 if lv_temp = 'ZERO'	 then&#10;	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-1)||'0'; 	&#10;	 else &#10;			 if substr(ln_rounded_prem,length(ln_rounded_prem),1) = 0 and ln_round_digits <> 1 then&#10;			 	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-1)||'0'; &#10;			 elsif substr(ln_rounded_prem,length(ln_rounded_prem),1) > 0 and &#10;			 	 substr(ln_rounded_prem,length(ln_rounded_prem),1) <= 9 and&#10;			 	 Ln_round_digits <> 1 then &#10;			 	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-2)||substr(ln_rounded_prem,length(ln_rounded_prem)-1,1)+1||'0'; &#10;			 	 elsif substr(ln_rounded_prem,length(ln_rounded_prem),1) > 0 and &#10;			 	 substr(ln_rounded_prem,length(ln_rounded_prem),1) <= 9 and&#10;			 	 Ln_round_digits = 1 then&#10;			 	 ln_first_value := floor(ln_first_value)+ 1;&#10;			 	 ln_prem := 0; 	 &#10;			 	 end if;	 &#10; end if;		 &#10;	 End if;&#10;	 ln_prem := floor(ln_first_value)||'.'||ln_prem;&#10;	 elsif lv_decimal_side = 'B' and lv_round_method in ('F','C') &#10;	 and lv_first_cut_digit_check = 'N' and Ln_round_digits <> 0 then&#10;	 If ln_round_to = 0 and lv_round_method = 'C' then&#10; 	 ln_temp := substr(ln_rounded_prem,(length(ln_rounded_prem)-ln_round_digits+1),1);&#10; 	 if ln_temp >= 1 and ln_temp <= 4 then&#10; 	 	 ln_temp := ln_temp + 5;&#10; 	 end if;&#10; 	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-ln_round_digits)||ln_temp||substr(ln_rounded_prem,length(ln_rounded_prem)-ln_round_digits+2,ln_round_digits-1);&#10; 	 ln_prem := round(ln_prem,'-'||ln_round_digits);&#10; end if;	 &#10; If ln_round_to = 0 and lv_round_method = 'F' then&#10; 	 ln_temp := substr(ln_rounded_prem,(length(ln_rounded_prem)-ln_round_digits+1),1);&#10; 	 if ln_temp >= 5 and ln_temp <= 9 then&#10; 	 	 ln_temp := ln_temp - 5;&#10; 	 end if;&#10; 	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-ln_round_digits)||ln_temp||substr(ln_rounded_prem,length(ln_rounded_prem)-ln_round_digits+2,ln_round_digits-1);&#10; 	 ln_prem := round(ln_prem,'-'||ln_round_digits);&#10; end if;&#10; &#10; If ln_round_to = 5 and lv_round_method = 'C' then&#10; 	 ln_temp := substr(ln_rounded_prem,(length(ln_rounded_prem)-ln_round_digits+1),1);&#10; 	 if ln_temp >= 1 and ln_temp <= 5 then&#10; 	 	 ln_temp := 5;&#10; 	 	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-ln_round_digits)||ln_temp;&#10; 	 elsif ln_temp >= 6 and ln_temp <= 9 then&#10; 	 	 ln_temp := 0;&#10; 	 	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-ln_round_digits)+1||ln_temp;&#10; 	 	 if ln_prem = 0 then&#10; 	 	 	 ln_prem := 10;&#10; 	 	 	 ln_rounded_prem := ln_rounded_prem || 1;&#10; 	 	 end if;	 &#10; 	 elsif ln_temp = 0 then&#10; 	 	 ln_temp := 0;&#10; 	 	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-ln_round_digits)||ln_temp;&#10; 	 end if;&#10; 	 ln_prem := rpad(ln_prem,length(ln_rounded_prem),0);&#10; end if;&#10; &#10; If ln_round_to = 5 and lv_round_method = 'F' then&#10; 	 ln_temp := substr(ln_rounded_prem,(length(ln_rounded_prem)-ln_round_digits+1),1);&#10; 	 if ln_temp >= 0 and ln_temp <= 4 then&#10; 	 	 ln_temp := 0;&#10; 	 	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-ln_round_digits)||ln_temp;&#10; 	 elsif ln_temp >= 5 and ln_temp <= 9 then&#10; 	 	 ln_temp := 5;&#10; 	 	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-ln_round_digits)||ln_temp;&#10; 	 end if;	 &#10; 	 ln_prem := rpad(ln_prem,length(ln_rounded_prem),0);&#10; 	 end if;&#10; elsif lv_round_method = 'R' and ln_round_to = 0 and lv_first_cut_digit_check = 'N' then&#10; 	 	 if lv_decimal_side = 'A' then&#10; 	 	 ln_temp := nvl(substr(ln_rounded_prem,ln_round_digits,1),0);&#10; 	 	 if lv_temp = 'ZERO'	 then&#10;	 ln_prem := 0;&#10;	 else&#10;		 	 if ln_temp in (0,1,2,3,4) then&#10;		 	 	 ln_prem :=substr(ln_rounded_prem,1,ln_round_digits-1)||'0';&#10;		 	 elsif ln_temp in (5,6,7,8,9) and ln_round_digits <> 1 then&#10;		 	 	 ln_prem :=substr(ln_rounded_prem,1,ln_round_digits-1)+1||'0';&#10;		 	 elsif ln_temp in (5,6,7,8,9) and ln_round_digits =1 then &#10;		 	 	 ln_prem := 0;&#10;		 	 	 ln_first_value := floor(ln_first_value) + 1;&#10;		 	 end if;&#10;		 	 end if; &#10; 	 ln_prem := floor(ln_first_value)||'.'||ln_prem;&#10; elsif lv_decimal_side = 'B' and ln_round_digits <> 0 then&#10; 	 ln_temp := substr(ln_rounded_prem,(length(ln_rounded_prem)-ln_round_digits+1),1);	&#10; 	 if ln_temp in (0,1,2,3,4) then&#10; 	 	 ln_prem :=substr(ln_rounded_prem,1,length(ln_rounded_prem)-ln_round_digits)||'0';&#10; 	 elsif ln_temp in (5,6,7,8,9) and ln_round_digits <> 0 then&#10; 	 	 ln_prem :=substr(ln_rounded_prem,1,length(ln_rounded_prem)-ln_round_digits)+1||'0';&#10; 	 	 if ln_prem = 0 then&#10; 	 	 	 ln_prem := 10;&#10; 	 	 	 ln_rounded_prem := ln_rounded_prem || 1;&#10; 	 	 end if;	&#10; 	 end if;&#10; 	 ln_prem := rpad(ln_prem,length(ln_rounded_prem),0);&#10; 	 elsif lv_decimal_side = 'B' and ln_round_digits = 0 then&#10; ln_prem := ln_rounded_prem;&#10; end if; 	 	&#10; &#10; elsif lv_round_method = 'R' and ln_round_to = 5 and lv_first_cut_digit_check = 'N' then&#10; 	 	 if lv_decimal_side = 'A' then&#10; 	 	 	 if lv_temp = 'ZERO'	 then&#10;	 ln_prem := substr(ln_rounded_prem,1,length(ln_rounded_prem)-1)||'0'; 	&#10;	 else &#10;		 	 	 ln_temp := nvl(substr(ln_rounded_prem,ln_round_digits,1),0);&#10;		 	 if ln_temp in (0,1,2) then&#10;		 	 	 ln_prem :=substr(ln_rounded_prem,1,ln_round_digits-1)||'0';&#10;		 	 elsif ln_temp in (3,4,5,6,7) then &#10;		 	 	 ln_prem :=substr(ln_rounded_prem,1,ln_round_digits-1)||'5';&#10;		 	 elsif ln_temp in (8,9) and ln_round_digits <> 1 then&#10;		 	 	 ln_prem :=substr(ln_rounded_prem,1,ln_round_digits-1)+1;&#10;		 	 	 ln_prem := rpad(ln_prem,length(ln_prem+1),0);&#10;		 	 elsif ln_temp in (8,9) and ln_round_digits =1 then &#10;		 	 	 ln_prem := 0;&#10;		 	 	 ln_first_value := floor(ln_first_value) + 1;&#10;		 	 end if; &#10;		 	 end if; &#10;		 	 ln_prem := floor(ln_first_value)||'.'||ln_prem;&#10; elsif lv_decimal_side = 'B' and ln_round_digits <> 0 then&#10; 	 ln_temp := substr(ln_rounded_prem,(length(ln_rounded_prem)-ln_round_digits+1),1);	&#10; 	 if ln_temp in (0,1,2) then&#10; 	 	 ln_prem :=substr(ln_rounded_prem,1,length(ln_rounded_prem)-ln_round_digits)||'0';&#10; 	 elsif ln_temp in (3,4,5,6,7) then &#10; 	 	 ln_prem :=substr(ln_rounded_prem,1,length(ln_rounded_prem)-ln_round_digits)||'5';&#10; 	 elsif ln_temp in (8,9) and ln_round_digits <> 0 then&#10; 	 	 ln_prem :=substr(ln_rounded_prem,1,length(ln_rounded_prem)-ln_round_digits)+1||'0';&#10; 	 	 if ln_prem = 0 then&#10; 	 	 	 ln_prem := 10;&#10; 	 	 	 ln_rounded_prem := ln_rounded_prem || 1;&#10; 	 	 end if;	&#10; 	 end if;&#10; 	 ln_prem := rpad(ln_prem,length(ln_rounded_prem),0);&#10; 	 elsif lv_decimal_side = 'B' and ln_round_digits = 0 then&#10; ln_prem := ln_rounded_prem;&#10; end if; 	 &#10; End if;&#10; end if;&#10;	 end if; &#10; RETURN ln_prem ;&#10;End; "/>
<Window Name="WINDOW1" Width="360" Height="324"/>
</FormModule>
</Module>
【问题讨论】:
-
您说要删除不需要的数据。不需要什么数据?如果你有这个 xml 对象,你想从中得到什么以及以什么格式?你想把它保存在xml中吗?将其更改为字典或数据列表,然后插入某处?
-
我基本上只需要物品的所有价值。比如
改为: BLOCK2 true 9 135 ,格式可以是文本。我在搜索部分没有太多经验。最后我想查询这些字符串。我的挑战是我不确定每个标签中有多少属性以及它们的属性是什么(XML 属性)。 -
任何不是根的东西都可以被认为是一个“项目”。你怎么知道某物是不是物品?
FormModule里面有什么东西吗?任何带有标签Item的东西? -
Oracle表单包含几个部分,基本上我需要提取
标签内的所有内容,这意味着“FormModule”,“Coordinate”,“Block”,“Item”,“Trigger”的所有属性",,"Canvas ","ProgramUnit " 和 "Window " 应该解析和提取。(只是它们的值)
标签: python xml oracleforms