2014-09-15 2 views
1

xml 파일을 구문 분석하는 데 사용되는 python 스크립트에 문제가 있습니다.Python : Xml 구문 분석 방법

file.xml

<Tag1 SchemaVersion="1.1" xmlns="http://www.microsoft.com/axe"> 
    <RandomTag>TextText</RandomTag> 
    <Tag2 xmlns="http://schemas.datacontract.org/2004/07"> 
     <AnotherRandom>Abc</AnotherRandom> 
    </Tag2> 
</Tag1> 

내가 방법을 구문 분석으로 xml.etree.ElementTree을 사용하고 있습니다 : XML 파일입니다. 내 작업은 RandomTag (이 경우 "TextText") 사이의 태그를 변경하는 것입니다. 이것은 파이썬 코드 : 코드가 잘 작동

파이썬 코드

import xml.etree.ElementTree as ET 

customXmlFile = 'file.xml' 

ns = { 
'ns': 'http://www.microsoft.com/axe', 
'sc': 'http://schemas.datacontract.org/2004/07/Microsoft.Assessments.Relax.ObjectModel_V1' 
} 
tree = ET.parse(customXmlFile) 
root = tree.getroot() 
node = root.find('ns:RandomTag', namespaces=ns) 
node.text = 'NEW TEXT' 
ET.register_namespace('', 'http://www.microsoft.com/axe') 

tree.write(customXmlFile + ".new", 
xml_declaration=True, 
encoding='utf-8', 
method="xml") 

나는 시간 오류를 실행하지 않지만, 모든 네임 스페이스 AnotherRandom에서 첫 번째 노드 (TAG1)에서 정의하고 Tag2은 shorcut으로 사용됩니다. 또한 SchemaVersion이 삭제됩니다. file.xml.new

- 출력

<?xml version='1.0' encoding='utf-8'?> 
<Tag1 xmlns="http://www.microsoft.com/axe" xmlns:ns1="http://schemas.datacontract.org/2004/07" SchemaVersion="1.1"> 
     <RandomTag>NEW TEXT</RandomTag> 
     <ns1:Tag2> 
      <ns1:AnotherRandom>Abc</ns1:AnotherRandom> 
     </ns1:Tag2> 
</Tag1> 

file.xml.new - 원하는 나는 beggining에에서로 정확한 XML의 동일한 형식을 얻기 위해 변경해야합니까 출력

<Tag1 SchemaVersion="1.1" xmlns="http://www.microsoft.com/axe"> 
    <RandomTag>TextText</RandomTag> 
    <Tag2 xmlns="http://schemas.datacontract.org/2004/07"> 
     <AnotherRandom>NEW TEXT</AnotherRandom> 
    </Tag2> 
</Tag1> 

텍스트 만 바뀌 었습니까?

+0

XML 파일 몇 가지 문제가 있습니다. 코드에 따라 코드가 출력됩니다. 문제를 진단하는 데 도움이되는 오타를 수정할 수 있다면. 전체 작업 코드를 게시하십시오. 예를 들어, ns 사전은 등호가 아닌 콜론을 사용해야합니다. 물론 닫는 Tag1에는 슬래시가 있어야합니다. –

+0

나는이 두 가지 문제를 해결했습니다. 큰 XML 코드이므로 전체 XML 코드를 복사 할 수 없습니다. 주로 구조는이 코드와 동일하며 파이썬 코드는 질문에 표시된 것과 같습니다. –

+0

또한 find() 호출에서 네임 스페이스가 아닌 네임 스페이스가 있어야한다고 생각합니다. 오타가 더 이상 없습니까? 수입품은 어떨까요? 복사/붙여 넣기가 작동 코드 여야한다는 것을 확실히 알아야합니다. 또한 어떤 Python 버전을 사용하고 있습니까? –

답변

0

이것은 약간의 해킹이지만 당신이 원하는 종류의 일을 할 것입니다. 그러나 이와 같은 네임 스페이스를 가지고 노는 것은 확실히 XML 표준을 위반합니다. 네임 스페이스를보다 잘 다루려면 lxml을 확인해 보는 것이 좋습니다.

파일에서 구문 분석하기 전에 register_namespace()을 호출해야합니다. 이 함수를 반복적으로 호출하면 이전 매핑이 덮어 쓰기 때문에 내부 명령을 수동으로 편집해야합니다. 이 페이지에 대한 자세한 내용은

import xml.etree.ElementTree as ET 

customXmlFile = 'test.xml' 

ns = {'ns': 'http://www.microsoft.com/axe', 
     'sc': 'http://schemas.datacontract.org/2004/07/'} 

ET.register_namespace('', 'http://www.microsoft.com/axe') 
ET._namespace_map['http://schemas.datacontract.org/2004/07'] = '' 

tree = ET.parse(customXmlFile) 
root = tree.getroot() 
node = root.find('ns:RandomTag', namespaces=ns) 
node.text = 'NEW TEXT' 

tree.write(customXmlFile + ".new", 
     xml_declaration=True, 
     encoding='utf-8', 
     method="xml") 

: 코드를 마찬가지로

http://effbot.org/zone/element-namespaces.htm

Saving XML files using ElementTree

Cannot write XML file with default namespace

+0

답변 해 주셔서 감사합니다. 나는 당신의 솔루션을 시도했지만 출력은 내가 원하는 것이 아닙니다. 증서에, 나는 더 이상 그 shorcuts 'ns1'하지만 모든 네임 스페이스가 첫 번째 태그에 정의되어 있지 않습니다. 정확히 어디에 있었는지 정의해야합니다. 인터넷에 대한 조사를 해봤지만 아무것도 찾을 수 없었습니다. 결국 XML 파일을 텍스트 파일과 같이 구문 분석하고 문자열에 특정한 함수를 사용하여 원하는 값을 변경했습니다. –

+0

나는 그것이 당신이 원하는 바를 정확하게 깨닫지 못했습니다. 다행 인 것을 발견해서 다행입니다. –