2011-01-31 5 views
0

제 3자가 제공 한 XML 파일을 편집 중입니다. XML은 전체 환경을 재생성하는 데 사용되며 XML을 편집하여 변경 사항을 전파 할 수 있습니다. 명령 줄 옵션을 통해 변경하고 XML을 저장하려는 요소를 조회 할 수 있었지만 특수 문자가 이스케이프되고 특수 문자를 유지해야합니다. 예를 들어,> gt gt;로 변경 중입니다. .write 조작 중 파일에서.파이썬 lxml 모듈을 사용하여 텍스트 노드에 특수 문자 보존

import sys 
from lxml import etree 
from optparse import OptionParser 

def parseCommandLine(): 
    usage = "usage: %prog [options] arg" 
    parser = OptionParser(usage) 
    parser.add_option("-f","--file",dest="filename", 
        help="Context File name including full path", metavar="CONTEXT_FILE") 

parser.add_option("-k","--key",dest="key", 
        help="Key you are looking for in Context File i.e s_isAdmin", metavar="s_someKey") 

parser.add_option("-v","--value",dest="value", 
        help="The replacement value for the key") 

if len(sys.argv[1:]) < 3: 
    print len(sys.argv[1:]) 
    parser.print_help() 
    sys.exit(2) 

(options, args) = parser.parse_args() 
return options.filename, options.key, options.value 
Filename, Key, Value=parseCommandLine() 
parser_options=etree.XMLParser(attribute_defaults=True, dtd_validation=False,  strip_cdata=False) 
doc = etree.parse(Filename, parser_options) #Open and parse the file 
print doc.findall("//*[@oa_var=%r]" % Key)[0].text 
oldval = doc.findall("//*[@oa_var=%r]" % Key)[0].text 
val = doc.findall("//*[@oa_var=%r]" % Key)[0] 
val.text = Value 

print 'old value is %s' % oldval 
print 'new value is %s' % val.text 

root = doc.getroot() 
doc.write(Filename,method='xml',with_tail=True,pretty_print=False) 

원본 파일이 있습니다 :

TF 이것은 노드 요소뿐만 아니라 XML 문서의 모든 차례 나오는에 영향을주는 다음은 내 코드입니다 (나는 그것이라는 것을 생각).

tf.fm.FulfillmentServer &gt;&gt; /s_u01/app/applmgr/f 
,745 : fm.FulfillmentServer >>/s_u01/애플리케이션/applmgr/

저장된 버전이 교체되는 F

나는 파싱 측면에서 출력 측 DTD 유효성 검사에서 pretty_print를 엉망으로 만들려고 노력해 왔으며 나는 혼란 스럽다.

나는 단지 s_cookie_domain 업데이트 : 아래

변경된 파일과 원본 파일에서 DIFF입니다. 내가 생각할 수있는

diff finprod_acfpdb10.xml_original finprod_acfpdb10.xml        
Warning: missing newline at end of file finprod_acfpdb10.xml 
1,3c1 
< <?xml version = '1.0'?> 
< <!-- $Header: adxmlctx.tmp 115.426 2009/05/08 08:46:29 rdamodar ship $ --> 
< <!-- 
--- 
> <!-- $Header: adxmlctx.tmp 115.426 2009/05/08 08:46:29 rdamodar ship $ --><!-- 
13,14c11 
< --> 
< <oa_context version="$Revision: 115.426 $"> 
--- 
> --><oa_context version="$Revision: 115.426 $"> 
242c239 
<   <cookiedomain oa_var="s_cookie_domain">.apollogrp.edu</cookiedomain> 
--- 
>   <cookiedomain oa_var="s_cookie_domain">.qadoamin.edu</cookiedomain> 
526c523 
<   <FORMS60_BLOCK_URL_CHARACTERS oa_var="s_f60blockurlchar">%0a,%0d,!,%21,",%22,%28,%29,;,[,%5b,],%5d,{,%7b,|,%7c,},%7d,%7f,>,%3c,&lt;,%3e</FORMS60_BLOCK_URL_CHARACTERS> 
--- 
>   <FORMS60_BLOCK_URL_CHARACTERS oa_var="s_f60blockurlchar">%0a,%0d,!,%21,",%22,%28,%29,;,[,%5b,],%5d,{,%7b,|,%7c,},%7d,%7f,&gt;,%3c,&lt;,%3e</FORMS60_BLOCK_URL_CHARACTERS> 
940c937 
<   <start_cmd oa_var="s_jtffstart">/s_u01/app/applmgr/jdk1.5.0_11/bin/java -Xmx512M -classpath .:/s_u01/app/applmgr/finprod/comn/java/jdbc111.zip:/s_u01/app/applmgr/finprod/comn/java/xmlparserv2.zip:/s_u01/app/applmgr/finprod/comn/java:/s_u01/app/applmgr/finprod/comn/java/apps.zip:/s_u01/app/applmgr/jdk1.5.0_11/classes:/s_u01/app/applmgr/jdk1.5.0_11/lib:/s_u01/app/applmgr/jdk1.5.0_11/lib/classes.zip:/s_u01/app/applmgr/jdk1.5.0_11/lib/classes.jar:/s_u01/app/applmgr/jdk1.5.0_11/lib/rt.jar:/s_u01/app/applmgr/jdk1.5.0_11/lib/i18n.jar:/s_u01/app/applmgr/finprod/comn/java/3rdparty/RFJavaInt.zip: -Dengine.LogPath=/s_u01/app/applmgr/finprod/comn/admin/log/finprod_acfpdb10 -Dengine.TempDir=/s_u01/app/applmgr/finprod/comn/temp -Dengine.CommandPromptEnabled=false -Dengine.CommandPort=11000 -Dengine.AOLJ.config=/s_u01/app/applmgr/finprod/appl/fnd/11.5.0/secure/acfpdb10_finprod.dbc -Dengine.ServerID=5000 -Ddebug=off -Dengine.LogLevel=1 -Dlog.ShowWarnings=false -Dengine.FaxEnabler=oracle.apps.jtf.fm.engine.rightfax.RfFaxEnablerImpl -Dengine.PrintEnabler=oracle.apps.jtf.fm.engine.rightfax.RfPrintEnablerImpl -Dfax.TempDir=/s_u01/app/applmgr/finprod/comn/admin/log/finprod_acfpdb10 -Dprint.TempDir=/s_u01/app/applmgr/finprod/comn/admin/log/finprod_acfpdb10 oracle.apps.jtf.fm.FulfillmentServer >> /s_u01/app/applmgr/finprod/comn/admin/log/finprod_acfpdb10/jtffmctl.txt</start_cmd> 
--- 
>   <start_cmd oa_var="s_jtffstart">/s_u01/app/applmgr/jdk1.5.0_11/bin/java -Xmx512M -classpath .:/s_u01/app/applmgr/finprod/comn/java/jdbc111.zip:/s_u01/app/applmgr/finprod/comn/java/xmlparserv2.zip:/s_u01/app/applmgr/finprod/comn/java:/s_u01/app/applmgr/finprod/comn/java/apps.zip:/s_u01/app/applmgr/jdk1.5.0_11/classes:/s_u01/app/applmgr/jdk1.5.0_11/lib:/s_u01/app/applmgr/jdk1.5.0_11/lib/classes.zip:/s_u01/app/applmgr/jdk1.5.0_11/lib/classes.jar:/s_u01/app/applmgr/jdk1.5.0_11/lib/rt.jar:/s_u01/app/applmgr/jdk1.5.0_11/lib/i18n.jar:/s_u01/app/applmgr/finprod/comn/java/3rdparty/RFJavaInt.zip: -Dengine.LogPath=/s_u01/app/applmgr/finprod/comn/admin/log/finprod_acfpdb10 -Dengine.TempDir=/s_u01/app/applmgr/finprod/comn/temp -Dengine.CommandPromptEnabled=false -Dengine.CommandPort=11000 -Dengine.AOLJ.config=/s_u01/app/applmgr/finprod/appl/fnd/11.5.0/secure/acfpdb10_finprod.dbc -Dengine.ServerID=5000 -Ddebug=off -Dengine.LogLevel=1 -Dlog.ShowWarnings=false -Dengine.FaxEnabler=oracle.apps.jtf.fm.engine.rightfax.RfFaxEnablerImpl -Dengine.PrintEnabler=oracle.apps.jtf.fm.engine.rightfax.RfPrintEnablerImpl -Dfax.TempDir=/s_u01/app/applmgr/finprod/comn/admin/log/finprod_acfpdb10 -Dprint.TempDir=/s_u01/app/applmgr/finprod/comn/admin/log/finprod_acfpdb10 oracle.apps.jtf.fm.FulfillmentServer &gt;&gt; /s_u01/app/applmgr/finprod/comn/admin/log/finprod_acfpdb10/jtffmctl.txt</start_cmd> 
983c980 
< </oa_context> 
--- 
> </oa_context> 
+1

소비자가 XML 파서를 사용하지 않는 이유는 무엇입니까? –

+0

원본 파일의 인코딩은 무엇입니까? 출력물은 xml이나 텍스트 여야합니까? – WombatPM

+0

파일 맨 위에 다음이 있습니다. 도움이됩니까? XML 파일은 Oracle Corp.에서 제공 한 것입니다. –

답변

1

용어 : 파서가 XML을 쓰지 않는다; 그들은 XML을 읽는다. Serialisers는 XML을 작성합니다.

일반 요소 내용에서 <&은 이스케이프 처리해야합니다. >은 CDATA 섹션의 끝이 아니며] [] 다음을 제외하고는] 합법적입니다. 대부분의 시리얼 라이저는 쉬운 방법을 사용하여 &gt;을 작성합니다. 파서가 >을 처리 할 것이기 때문입니다.

나는 소비자가 실제로 출력 파일을 구문 분석 여부를 this 또는 this 또한 테스트 같은 XML 유효성 검사 서비스에 출력 및 입력 파일을 모두 제출하는 것이 좋습니다.

+0

내가 파이썬과 XML 처리에 대한 완전한 초보자라고 말한 것처럼 파서와 직렬자를 구분 해 주셔서 감사합니다. xmlvalidation.com을 사용하여 내 xml을 전달했지만 원본 파일과 업데이트 된 버전 모두를 사용하여 validrome.org/xml에 실패했습니다. 다른 사이트에서 파일을 테스트 한 결과 스키마 유효성 검사가 실패한 것처럼 보입니다. 말이 돼? –

+0

@Michael Ballent : 파서 ​​/ 직렬 자 구분은 언어와 파일 형식에 관계없이 적용됩니다. Dome이 아닌 어떤 돔 (dome)이 화나게되었는지를 말하면 도움이 될 수 있습니다. 그러나 '>'또는 '>'문제와 관련이 없다고 생각할 수 있습니다. 소비자가 출력 파일을 어떻게 생각합니까? 스키마 유효성 확인에 도움이 필요하면 새로운 질문을 시작하십시오. –

+0

오류 '는'oa_context '요소의 선언을 찾을 수 없습니다. '>' '>은 전혀 나오지 않았습니다. 나는 환경을 실행할 때 소비자와 파일을 테스트해야한다. –

1

있는 유일한 방법은 (파서가 명확하게 XML 태그 닫는 괄호를 변화로) 당신은 CDATA 블록으로 수정 노드를 처리하는 파서를 강요한다. val.text = Value 대신 val.text = etree.CDATA(Value)을 시도하십시오.

http://lxml.de/api.html#cdata

+0

더 큰 것을 벗어나는 대치 된 값뿐만 아니라 그 노드가 내가 만지지 않는 다른 노드에도있다. –