AdBlock을 비활성화합니다

AdBlock은 사이트의 일부 콘텐츠를 차단하고 있습니다

ADBlock errore

문제

저는 XML 문서를 구성하고 웹 서비스에 게시하는 데 필요한 프로젝트를 만들려고합니다. 이에 대한 기술을 확장하기위한 수단으로 Python으로 작성하고 싶습니다.

안타깝게도 .NET에서 XML 모델을 상당히 잘 알고 있지만 Python에서 XML 모델의 장단점이 무엇인지는 잘 모르겠습니다.

누구나 Python에서 XML 처리를 해본 경험이 있습니까?어디에서 시작하라고 제안 하시겠습니까?빌드 할 XML 파일은 매우 간단합니다.

해결책

개인적으로 저는 XML이 많은 프로젝트에서 몇 가지 내장 옵션을 가지고 놀았고 pulldom

특히 작고 단순한 것의 경우 상대적으로 간단한 구조를 위해 수많은 콜백을 설정하는 것보다 이벤트 중심의 구문 분석 이론을 좋아합니다. 다음은 API 사용 방법에 대한 간단한 설명입니다 .

내가 좋아하는 것 : 콜백을 사용하는 대신 for 루프에서 구문 분석을 처리 할 수 있습니다.또한 전체 구문 분석 ( "pull"부분)을 지연하고 expandNode()를 호출 할 때만 추가 세부 정보를 얻습니다.이것은 사용의 용이성과 단순성을 희생하지 않으면 서 "책임감있는"효율성에 대한 나의 일반적인 요구 사항을 충족시킵니다.

다른 팁

ElementTree 에는 멋진 파이썬 API가 있습니다.파이썬 2.5의 일부로도 제공되는 것 같아요

순수한 파이썬이고 내가 말했듯이 꽤 좋지만 더 많은 성능이 필요하다면 lxml 는 동일한 API를 노출하고 내부적으로 libxml2를 사용합니다.이론적으로는 필요할 때 교체 할 수 있습니다.

XML을 다루는 방법에는 일반적으로 dom, sax 및 xpath의 세 가지 주요 방법이 있습니다. dom 모델은 전체 xml 파일을 한 번에 메모리에로드 할 수 있고 데이터 구조를 다루는 데 신경 쓰지 않고 모델의 대부분을보고있는 경우에 좋습니다. sax 모델은 몇 개의 태그에만 관심이 있거나 큰 파일을 처리하고 순차적으로 처리 할 수있는 경우에 좋습니다. xpath 모델은 각각 조금씩 있습니다. 필요한 데이터 요소에 대한 경로를 선택하고 선택할 수 있지만 사용하려면 더 많은 라이브러리가 필요합니다.

직접적이고 Python과 함께 패키지화하고 싶다면 minidom이 답이지만 상당히 절름발이이며 문서는 "here 's docs on dom, go it out"입니다. 정말 짜증납니다.

개인적으로 저는 dom과 유사한 모델 인 ElementTree의 더 빠른 (c 기반) 구현 인 cElementTree를 좋아합니다.

저는 sax 시스템을 사용해 왔고 여러면에서 느낌이 더 "비단뱀 적"이지만 일반적으로이를 처리하기 위해 상태 기반 시스템을 생성하게되는데, 그런 식으로 광기 (및 버그)가 있습니다.

연구를 좋아한다면 minidom을 사용하고, 잘 작동하는 좋은 코드를 원한다면 ElementTree를 사용하십시오.

여러 프로젝트에 ElementTree를 사용했으며 권장합니다.

순수 Python 버전보다 20 배 더 빠르고 사용하기 매우 쉬운 c 버전 cElementTree (xml.etree.cElementTree)를 포함하여 Python 2.5에서 '기본 제공'으로 제공됩니다.

lxml에는 약간의 성능 이점이 있지만 고르지 않으며 사용 사례에 대한 벤치 마크를 먼저 확인해야합니다.

내가 이해하는대로 ElementTree 코드는 lxml로 쉽게 이식 될 수 있습니다.

문서가 얼마나 복잡해야하는지에 따라 다릅니다.

저는 XML을 작성하기 위해 minidom을 많이 사용했지만 일반적으로 문서를 읽고 몇 가지 간단한 변형을 수행 한 다음 다시 작성하는 것입니다. XML을 제대로 구문 분석하지 않는 오래된 응용 프로그램을 충족시키기 위해 요소 속성을 주문할 수있는 기능이 필요할 때까지 충분히 작동했습니다. 그 시점에서 저는 포기하고 XML을 직접 작성했습니다.

단순한 문서로만 작업하는 경우 프레임 워크를 배우는 것보다 직접 작업하는 것이 더 빠르고 간단 할 수 있습니다. 손으로 XML을 작성할 수 있다면 아마도 손으로 코딩 할 수도 있습니다 (특수 문자를 적절히 이스케이프 처리하고 str.encode(codec, errors="xmlcharrefreplace")를 사용하는 것을 잊지 마십시오). 이러한 스나 푸스 외에도 XML은 작성하는 데 특별한 라이브러리가 필요하지 않을만큼 충분히 규칙적입니다. 문서가 너무 복잡해서 손으로 작성하기 어렵다면 이미 언급 한 프레임 워크 중 하나를 살펴 봐야합니다. 어떤 시점에서도 일반적인 XML 작성기를 작성할 필요가 없습니다.

untangle 을 사용해 간단한 XML 문서를 구문 분석 할 수도 있습니다.

"상당히 간단한"XML을 만들 것이라고 언급 했으므로 minidom 모듈 (Python 표준 라이브러리의 일부)이 귀하의 요구에 적합 할 것입니다.XML의 DOM 표현에 대한 경험이 있다면 API가 매우 간단하다는 것을 알게 될 것입니다.

XML 요청을 수신하고 XML 응답을 생성하는 SOAP 서버를 작성합니다. (안타깝게도 제 프로젝트가 아니므로 비공개 소스이지만 또 다른 문제입니다.)

스키마에 "적합한"데이터 구조를 가지고 있다면 (SOAP) XML 문서를 만드는 것이 매우 간단하다는 것을 알게되었습니다.

응답 봉투가 요청 봉투와 거의 같으므로 봉투를 유지합니다. 그런 다음 내 데이터 구조가 (중첩 된) 사전이므로이 사전을 value 항목으로 바꾸는 문자열을 만듭니다.

이것은 재귀가 간단하게 만드는 작업이며 올바른 구조로 끝납니다. 이것은 모두 파이썬 코드로 이루어지며 현재 프로덕션 용도로 충분히 빠릅니다.

또한 (상대적으로) 목록을 쉽게 작성할 수도 있지만, 클라이언트에 따라 길이 힌트를 제공하지 않으면 문제가 발생할 수 있습니다.

저에게는 사전이 일부 사용자 정의 클래스보다 훨씬 쉽게 작업 할 수있는 방법이기 때문에 훨씬 간단했습니다. 책의 경우 XML 생성이 구문 분석보다 훨씬 쉽습니다!

Python에서 XML로 진지하게 작업하려면 lxml을 사용하십시오.

Python은 ElementTree 내장 라이브러리와 함께 제공되지만 lxml은 속도와 기능 (스키마 유효성 검사, sax 구문 분석, XPath, 다양한 종류의 반복기 및 기타 기능) 측면에서이를 확장합니다.

설치해야하지만 많은 곳에서 이미 표준 장비의 일부인 것으로 간주됩니다 (예 : Google AppEngine은 C 기반 Python 패키지를 허용하지 않지만 lxml, pyyaml ​​및 기타 일부에 대해서는 예외). .

E-factory로 XML 문서 작성 (lxml에서)

귀하의 질문은 XML 문서 작성에 관한 것입니다.

lxml에는 많은 방법이 있으며 사용하기 쉽고 읽기 쉬운 방법을 찾는 데 시간이 걸렸습니다.

E-factory 사용에 대한 lxml 문서 의 샘플 코드 (약간 단순화 ) : <시간>

E-factory는 XML 및 HTML 생성을위한 간단하고 간결한 구문을 제공합니다. 라코 디스 <시간>

다음 사항에 대해 E-factory에 감사드립니다

코드는 거의 결과 XML 문서처럼 읽습니다.

가독성이 중요합니다.

모든 XML 콘텐츠 생성 허용

다음과 같은 항목을 지원합니다.

  • 네임 스페이스 사용
  • 한 요소 내에서 시작 및 끝 텍스트 노드
  • 속성 콘텐츠 형식 지정 기능 ( 전체 lxml 샘플 의 func CLASS 참조)

    목록으로 매우 읽기 쉬운 구조 허용

    예 : 라코 디스

    결과 : 라코 디스

    결론

    저는 lxml 튜토리얼을 읽을 것을 강력히 추천합니다. 매우 잘 작성되었으며이 강력한 라이브러리를 사용해야하는 더 많은 이유를 제공합니다.

    lxml의 유일한 단점은 컴파일해야한다는 것입니다. 휠 형식 패키지에서 lxml을 1 초 내에 설치하는 방법에 대한 자세한 내용은 SO 답변 을 참조하세요.

SOAP 메시지를 작성하려는 경우 soaplib 를 확인하세요.내부적으로 ElementTree를 사용하지만 메시지 직렬화 및 역 직렬화를위한 훨씬 깔끔한 인터페이스를 제공합니다.

Python 라이브러리에서 구현하는 SAX - Simple API for XML를 강력히 권장합니다.이전 포스터에서 설명한 것처럼 구동 된 XML로 큰 API를 설정하고 처리하기가 상당히 쉬우 며 DOM 스타일의 XML 파서의 유효성을 검사하는 것과 달리 메모리 공간이 적습니다.

나는 XML을 처리하는 .Net 방식이 MSXML의 일부 버전을 기반으로한다고 가정하고,이 경우 예를 들어 minidom을 사용하면 집에있는 것처럼 느껴질 것이라고 가정합니다.그러나 간단한 처리라면 어떤 라이브러리라도 할 수있을 것입니다.

또한 Python에서 xml을 다룰 때 ElementTree로 작업하는 것을 선호합니다. 매우 깔끔한 라이브러리입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow