2010-05-29 1 views
6

같은 XML 작성에 대한 xml.dom.minidom 같은 파일이 완벽하게 합법적 XML 코드이지만 항상헤더없이 XML 파일을 파이썬으로 작성하는 방법은 무엇입니까? 파이썬의 주식 XML 도구를 사용하는 경우

<?xml version="1.0"?>

[...]

처럼 시작 것, 그리고 심지어 사용하는 것이 좋습니다 머리말, 나는 함께 일하고있는 프로그램 중 하나가 여기에 문제가있어 그것을 없애고 싶다.

xml.dom.minidom에서 적절한 옵션을 찾을 수없는 것 같습니다. 헤더를 무시할 수있는 다른 패키지가 있는지 궁금합니다.

건배,

니코

+0

항상 StringIO 객체에 쓸 수 있으며 헤더를 제거하고 저장합니다. 이것은 아마도 새 라이브러리를 선택하는 것보다 쉽습니다. http://docs.python.org/library/stringio.html – msw

답변

13

불행히도 minidom은 XML 선언을 생략 할 수있는 옵션을 제공하지 않습니다.

document 대신 문서의 루트 요소에서 toxml()을 호출하여 문서 내용을 항상 serialize 할 수 있습니다. 그런 다음 당신은 XML 선언받지 않습니다 :

xml= document.documentElement.toxml('utf-8') 

을 ...하지만 당신은 또한 같은 DOCTYPE, 또는 의견이나 처리 명령으로 루트 요소 외부 무엇을 얻을 것입니다. 필요할 경우, 하나를 사용하여 문서 객체 하나의 각 어린이에는 직렬화 :

xml= '\n'.join(node.toxml('utf-8') for node in document.childNodes) 

나는 헤더를 무시 할 수 않는 다른 패키지가 있는지 궁금.

DOM 수준 3 LS definesxml-declaration config 매개 변수를 사용하면이를 억제 할 수 있습니다. 필자가 알고있는 Python 구현은 pxdom 뿐이며 표준 지원은 철저하지만 전혀 빠르지는 않습니다.

+1

레코드의 경우, LXML과 Python 2.7 ElementTree API는'.write()'에'xml_declaration = False'를 허용하고 LXML과 cElementTree는 매우 빠릅니다. – ssokolow

+0

"no xml-declaration"에 대한 2018 년 뉴스? XML은 파이썬에서 버려진 것처럼 보입니다 ... 대신 Java를 사용 하시겠습니까? 추신 : [none none] (https://docs.python.org/3/library/xml.dom.minidom.html). –

0

순수 주의자들은이 듣고 싶어하지 않을 수 있습니다,하지만 난 잔인한 XML을 생성하는 XML 파서를 사용하여 발견했다. 문자열로 직접 생성하십시오. 또한 DOM을 사용하여 수행 할 수없는 메모리 용량보다 큰 파일을 생성 할 수도 있습니다. XML을 읽는 것도 또 다른 이야기입니다.

+3

함정에 빠져 있습니다. XML을 순차 화하는 것은 XML을 파싱하는 것보다 쉽지만 XML을 올바르게 처리하려면 상당한주의가 필요합니다. 특성 값 (이스케이프시 정규화를 피하기 위해), (특히 UTF-8이 아닌 출력이 필요한 경우) CDATA 섹션 분할, 그리고 특히 이름 공간이 지정된 DOM 직렬화의 복잡성과 같은 공백과 같은 것들. 너는 * 실수로 실수를하고 잘 구성된 XML이 아닌 것을 생성 할 것이다. 그리고 모든 의미있는 아이들은 웃을 것입니다. – bobince

0

minidom을 사용하도록 설정 한 경우 파일을 다시 스캔하고 필요한 모든 XML을 작성한 후 첫 번째 행을 제거하면됩니다. 유사한

class RemoveFirstLine: 
    def __init__(self, f): 
     self.f = f 
     self.xmlTagFound = False 

    def __getattr__(self, attr): 
     return getattr(self, self.f) 

    def write(self, s): 
     if not self.xmlTagFound: 
      x = 0 # just to be safe 
      for x, c in enumerate(s): 
       if c == '>': 
        self.xmlTagFound = True 
        break 
      self.f.write(s[x+1:]) 
     else: 
      self.f.write(s) 

... 
f = RemoveFirstLine(open('path', 'wb')) 
Node.writexml(f, encoding='UTF-8') 

또는 무언가 :

0

당신은 첫 번째 태그를 제거하는 사용자 정의 파일 - 류의 객체, 예컨대을 사용할 수 있습니다. XML 파일이 상당히 큰 경우 파일을 완전히 다시 작성할 필요가 없다는 장점이 있습니다.

5

당신이 minidom을 사용하고 '귀여움'을 유지하려면 어떻게 이것에 대해 신속/해키 수정 같은 :

xml_without_declaration.py :

import xml.dom.minidom as xml 

doc = xml.Document() 

declaration = doc.toxml() 

a = doc.createElement("A") 
doc.appendChild(a) 
b = doc.createElement("B") 
a.appendChild(b) 

xml = doc.toprettyxml()[len(declaration):] 

print xml 
+0

이렇게하면 문자열의 처음에 줄 바꿈 문자가 생깁니다. 'xml = doc.toprettyxml() [(len (선언) + 1) :]'로 수정하십시오. –

관련 문제