2016-06-07 1 views
0

위치 기반 문자를 찾고 바꿀 수있는 방법을 찾는 데 어려움을 겪었습니다. 내가 찾고 있어요 기본적으로 무엇을이 문서에 가서 진수 문자를 삭제해야합니다 후알 수없는 문자를 기반으로 한 Python으로 찾기 및 바꾸기

<gco:DateTime>2016-04-20T11:27:34</gco:DateTime> 

모든 것을

<gco:DateTime>2016-04-20T11:27:34.8677919-06:00</gco:DateTime> 

를 교체합니다. 문제는 XML 파일에 여러 개의 타임 스탬프가있는 것입니다.이 타임 스탬프는 완전히 다릅니다. 내가 정규식에 조금 읽었습니다 그리고 그것은 가능한 방법처럼 보인다. 어떤 도움이라도 대단히 감사하겠습니다. 편집 예 XML 파일 형식의

:

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type='text/xsl' href='http://ngis/ngis/metadata/StyleSheet/xslt/nGIS_Metadata.xslt'?> 
<gmd:MD_Metadata xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gmx="http://www.isotc211.org/2005/gmx" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:gfc="http://www.isotc211.org/2005/gfc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gss="http://www.isotc211.org/2005/gss" xmlns:gsr="http://www.isotc211.org/2005/gsr" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gmi="http://www.isotc211.org/2005/gmi" xmlns:gmd="http://www.isotc211.org/2005/gmd"> 
    <gmd:fileIdentifier> 
     <gco:CharacterString>BF244A7CB62491BC74B001BE5DEAA213AAFB9DBA</gco:CharacterString> 
    </gmd:fileIdentifier> 
    <gmd:language> 
     <gco:CharacterString>English</gco:CharacterString> 
       <gmd:date> 
       <gco:DateTime>2016-04-20T11:27:34.8677919-06:00</gco:DateTime> 
       </gmd:date> 

@Parfait

+0

정규 표현식은이 문제와 다른 유사한 문제를 해결할 것이며 그에 대한 독서를 계속해야합니다. 이 특별한 경우에는 구문 분석 및 날짜 형식 지정도 좋은 방법입니다. –

+0

'lxml' 또는'ElementTree'와 같은 라이브러리를 사용하여 실제로 트리를 파싱하지 않고 XML을 처리하려고 시도하는 것에 대해주의를 기울일 것입니다.하지만 모든 transormations가 복잡하지 않은 경우에도 벗어날 수 있습니다. – holdenweb

+0

충분히 강조 할 수는 없습니다 (아마도 SO에서 가장 높은 투표 결과), [regex html/xml 파일을 만들지 마십시오] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml- 자체 포함 태그). – Parfait

답변

0

substring-before() 사용자가 필요로하는 매우 편리한 기능 (형제, XPath와 공유 됨)을 가지고있는 (XML 문서를 변환하기위한 특수 용도의 선언적 언어)을 고려하십시오.이 경우 시간 소인을 구분하는 기간 전에 데이터를 추출해야합니다. Python의 lxml 모듈은 XSLT 1.0 스크립트를 실행할 수 있습니다.

아래의 스크립트는 파일에서 XML 및 XSLT를 구문 분석합니다. 특히 XSLT는 Identity Transform을 실행하여 문서를 그대로 복사 한 다음 에서 시간을 모두<gco:DateTime>까지 추출합니다. 단지 필요한 gco 네임 스페이스는 XSLT 헤더에 정의되어 주 :

XSLT 스크립트

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
       xmlns:gco="http://www.isotc211.org/2005/gco"> 
<xsl:output version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*"/> 

    <!-- Identity Transform --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="gco:DateTime"> 
    <xsl:copy> 
     <xsl:copy-of select="substring-before(., '.')"/>     
    </xsl:copy> 
    </xsl:template> 

</xsl:transform> 

파이썬 스크립트

(파이썬에서 참조 할 끝내고 .xsl 파일로 같은 외부 저장)
import lxml.etree as ET 

# LOAD XML AND XSL 
dom = ET.parse('Input.xml') 
xslt = ET.parse('XSLTScript.xsl') 

# TRANSFORM XML 
transform = ET.XSLT(xslt) 
newdom = transform(dom) 

# CONVERT TO STRING 
tree_out = ET.tostring(newdom, encoding='UTF-8', pretty_print=True, xml_declaration=True) 

# OUTPUT TREE TO FILE 
xmlfile = open('Output.xml') 
xmlfile.write(tree_out) 
xmlfile.close() 

출력

<?xml version="1.0"?> 
<?xml-stylesheet type='text/xsl' href='http://ngis/ngis/metadata/StyleSheet/xslt/nGIS_Metadata.xslt'?><gmd:MD_Metadata xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gmx="http://www.isotc211.org/2005/gmx" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:gfc="http://www.isotc211.org/2005/gfc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gss="http://www.isotc211.org/2005/gss" xmlns:gsr="http://www.isotc211.org/2005/gsr" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gmi="http://www.isotc211.org/2005/gmi" xmlns:gmd="http://www.isotc211.org/2005/gmd"> 
    <gmd:fileIdentifier> 
    <gco:CharacterString>BF244A7CB62491BC74B001BE5DEAA213AAFB9DBA</gco:CharacterString> 
    </gmd:fileIdentifier> 
    <gmd:language> 
    <gco:CharacterString>English</gco:CharacterString> 
    <gmd:date> 
     <gco:DateTime>2016-04-20T11:27:34</gco:DateTime> 
    </gmd:date> 
    </gmd:language> 
</gmd:MD_Metadata> 
+0

고마워요. 정말 감사합니다! – MapZombie

+0

내 파일은 모두 으로 시작합니다. MapZombie

+0

실제 xml의 스 니펫 (정의되어야하는 네임 스페이스 'gco'가있는 모든 헤더)을 게시하십시오. 그리고 세 번째 줄부터 시작할 필요는 없습니다. – Parfait

0

한 가지 방법은 :

s = "<gco:DateTime>2016-04-20T11:27:34.8677919-06:00</gco:DateTime>" 
split_on_dot = s.split('.') 
split_on_angle = split_on_dot[1].split('<') 
new_s = "".join([split_on_dot[0], "<", split_on_angle[1]]) 

>>> new_s 
'<gco:DateTime>2016-04-20T11:27:34</gco:DateTime>' 
>>> 

이 입력 문자열에서의 기간 한정되는 기간에 따라 달라집니다. 나는 정규 표현식에 능숙하지 않다. 나는 그들이 과용 될 것이라고 생각하지만, 누군가가 당신에게 어떻게 정규식을 사용하는지 보여 줄 것이라고 확신합니다. 파이썬에는 기본적으로 좋은 문자열 조작이 있다는 것을 기억하십시오.

+0

감사합니다. joel, 각 파일에 대해 여러 개의 알 수없는 날짜를 통해 구문 분석 할 수 있어야합니다. 각 파일에는이 형식의 약 6 개의 날짜 스탬프가 있습니다.형식은 각각 하나씩 사용되며 한 기간 만 사용됩니다. – MapZombie

+0

그렇다면 좋지만, @holdenweb은 XML 파싱에 관해 언급합니다. 변경하려는 요소가 있으면 내 대답이 처리됩니다. Stephen Holden은 그가 가르친 과정에서 파이썬에 대해 소개했습니다. –