Python에서의 XML 처리
저는 XML 문서를 구성하고 웹 서비스에 게시하는 데 필요한 프로젝트를 만들려고합니다. 그에 대한 기술을 확장하기위한 수단으로 Python으로 작성하고 싶습니다.
불행히도 .NET에서 XML 모델을 꽤 잘 알고 있지만 Python에서 XML 모델의 장단점이 무엇인지 확실하지 않습니다.
누구나 Python에서 XML 처리를 해본 경험이 있습니까? 어디에서 시작하라고 제안 하시겠습니까? 빌드 할 XML 파일은 매우 간단합니다.
개인적으로 저는 XML을 많이 사용하는 프로젝트에서 몇 가지 기본 제공 옵션을 사용해 보았 으며 덜 복잡한 문서를위한 최선의 선택 으로 pulldom 을 선택했습니다.
특히 작고 단순한 것의 경우 비교적 단순한 구조에 대한 전체 콜백을 설정하는 것보다 이벤트 기반 구문 분석 이론을 좋아합니다. 다음은 API 사용 방법에 대한 간단한 설명입니다 .
내가 좋아하는 것 : for
콜백을 사용 하는 대신 루프 에서 구문 분석을 처리 할 수 있습니다 . 또한 전체 구문 분석 ( "pull"부분)을 지연하고을 호출 할 때만 추가 세부 정보를 얻습니다 expandNode()
. 이것은 사용의 용이성과 단순성을 희생하지 않으면 서 "책임있는"효율성에 대한 나의 일반적인 요구 사항을 충족시킵니다.
ElementTree 에는 멋진 파이썬 API가 있습니다. 파이썬 2.5의 일부로 배송되었다고 생각합니다.
그것은 순수한 파이썬이고 내가 말했듯이 꽤 멋지지만 더 많은 성능이 필요하면 lxml 은 동일한 API를 노출하고 내부적으로 libxml2를 사용합니다. 이론적으로는 필요할 때 교체 할 수 있습니다.
일반적으로 dom, sax 및 xpath의 세 가지 주요 XML 처리 방법이 있습니다. dom 모델은 전체 xml 파일을 한 번에 메모리에로드 할 수 있고 데이터 구조를 다루는 데 신경 쓰지 않고 모델의 대부분을보고있는 경우에 좋습니다. sax 모델은 몇 개의 태그 만 신경 쓰거나 큰 파일을 처리하고 순차적으로 처리 할 수있는 경우에 좋습니다. xpath 모델은 각각 조금씩 있습니다. 필요한 데이터 요소에 대한 경로를 선택하고 선택할 수 있지만 사용하려면 더 많은 라이브러리가 필요합니다.
간단하고 Python으로 패키지화하고 싶다면 minidom이 답이지만 매우 절름발이이며 문서는 "here 's doc on dom, go it out"입니다. 정말 짜증납니다.
개인적으로 저는 dom과 같은 모델 인 ElementTree의 더 빠른 (c 기반) 구현 인 cElementTree를 좋아합니다.
나는 색소폰 시스템을 사용 해왔고, 여러면에서 느낌이 더 "비단뱀 적"이지만, 보통 그것들을 처리하기 위해 상태 기반 시스템을 만드는 것으로 끝나고, 그런 식으로 광기 (및 버그)가 있습니다.
연구를 좋아한다면 minidom을 사용하고 잘 작동하는 좋은 코드를 원한다면 ElementTree를 사용하십시오.
여러 프로젝트에 ElementTree를 사용했으며 권장합니다.
파이썬 2.5에는 파이썬 2.5와 함께 제공되며 순수한 파이썬 버전보다 20 배 빠르고 사용하기 쉬운 c 버전 cElementTree (xml.etree.cElementTree)를 포함합니다.
lxml에는 몇 가지 성능 이점이 있지만 고르지 않으며 사용 사례에 대한 벤치 마크를 먼저 확인해야합니다.
내가 알기로 ElementTree 코드는 lxml로 쉽게 이식 할 수 있습니다.
문서가 얼마나 복잡해야하는지에 따라 다릅니다.
저는 XML을 작성하기 위해 minidom을 많이 사용했지만 일반적으로 문서를 읽고 몇 가지 간단한 변환을 수행하고 다시 작성하는 것입니다. XML을 제대로 구문 분석하지 않는 오래된 응용 프로그램을 충족시키기 위해 요소 속성을 주문할 수있는 기능이 필요할 때까지 충분히 작동했습니다. 그 시점에서 저는 포기하고 XML을 직접 작성했습니다.
간단한 문서로만 작업하는 경우 프레임 워크를 배우는 것보다 직접 작업하는 것이 더 빠르고 간단 할 수 있습니다. 손으로 XML을 작성할 수 있다면 아마도 직접 코딩 할 수도 있습니다 (특수 문자를 적절하게 이스케이프 처리하고를 사용하는 것을 잊지 마십시오 str.encode(codec, errors="xmlcharrefreplace")
). 이러한 snafus 외에도 XML은 작성하는 데 특별한 라이브러리가 필요 하지 않을 정도로 충분히 규칙적 입니다. 문서가 너무 복잡해서 손으로 작성하기 어렵다면 이미 언급 한 프레임 워크 중 하나를 살펴 봐야합니다. 일반적인 XML 작성기를 작성할 필요는 없습니다.
간단한 XML 문서를 구문 분석하기 위해 untangle 을 시도 할 수도 있습니다.
"상당히 단순한"XML을 구축 할 것이라고 언급 했으므로 minidom 모듈 (Python 표준 라이브러리의 일부)이 귀하의 요구에 적합 할 것입니다. XML의 DOM 표현에 대한 경험이 있다면 API가 매우 간단하다는 것을 알게 될 것입니다.
XML 요청을 받고 XML 응답을 생성하는 SOAP 서버를 작성합니다. (안타깝게도 내 프로젝트가 아니므로 폐쇄 된 소스이지만 또 다른 문제입니다.)
스키마에 "적합한"데이터 구조를 가지고 있다면 (SOAP) XML 문서를 만드는 것이 매우 간단하다는 것을 알게되었습니다.
응답 봉투가 요청 봉투와 거의 같으므로 봉투를 유지합니다. 그런 다음 내 데이터 구조가 (중첩 된) 사전이기 때문에이 사전을 <key> value </ key> 항목으로 바꾸는 문자열을 만듭니다.
이것은 재귀가 간단하게 만드는 작업이며 올바른 구조로 끝납니다. 이것은 모두 파이썬 코드로 이루어지며 현재 프로덕션 용으로 충분히 빠릅니다.
또한 (상대적으로) 목록을 쉽게 작성할 수도 있지만 클라이언트에 따라 길이 힌트를 제공하지 않으면 문제가 발생할 수 있습니다.
나에게 이것은 사전이 일부 사용자 정의 클래스보다 훨씬 쉬운 작업 방법이기 때문에 훨씬 간단했습니다. 책의 경우 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 생성을위한 간단하고 간단한 구문을 제공합니다.
>>> from lxml.builder import E
>>> html = page = (
... E.html( # create an Element called "html"
... E.head(
... E.title("This is a sample document")
... ),
... E.body(
... E.h1("Hello!"),
... E.p("This is a paragraph with ", E.b("bold"), " text in it!"),
... E.p("This is another paragraph, with a", "\n ",
... E.a("link", href="http://www.python.org"), "."),
... E.p("Here are some reserved characters: <spam&egg>."),
... )
... )
... )
>>> print(etree.tostring(page, pretty_print=True))
<html>
<head>
<title>This is a sample document</title>
</head>
<body>
<h1>Hello!</h1>
<p>This is a paragraph with <b>bold</b> text in it!</p>
<p>This is another paragraph, with a
<a href="http://www.python.org">link</a>.</p>
<p>Here are some reserved characters: <spam&egg>.</p>
</body>
</html>
E-factory에서 다음 사항에 감사드립니다.
Code reads almost as the resulting XML document
Readability counts.
Allows creation of any XML content
Supports stuff like:
- use of namespaces
- starting and ending text nodes within one element
- functions formatting attribute content (see func CLASS in full lxml sample)
Allows very readable constructs with lists
e.g.:
from lxml import etree
from lxml.builder import E
lst = ["alfa", "beta", "gama"]
xml = E.root(*[E.record(itm) for itm in lst])
etree.tostring(xml, pretty_print=True)
resulting in:
<root>
<record>alfa</record>
<record>beta</record>
<record>gama</record>
</root>
Conclusions
I highly recommend reading lxml tutorial - it is very well written and will give you many more reasons to use this powerful library.
The only disadvantage of lxml is, that it must be compiled. See SO answer for more tips how to install lxml from wheel format package within a fraction of a second.
If you're going to be building SOAP messages, check out soaplib. It uses ElementTree under the hood, but it provides a much cleaner interface for serializing and deserializing messages.
I strongly recommend SAX - Simple API for XML
- implementation in the Python libraries. They are fairly easy to setup and process large XML
by even driven API
, as discussed by previous posters here, and have low memory footprint unlike validating DOM
style XML
parsers.
I assume that the .Net-way of processing XML builds on some version of MSXML and in that case I assume that using for example minidom would make you feel somewhat at home. However, if it is simple processing you are doing any library will probably do.
I also prefer working with ElementTree when dealing with xml in Python, it is a very neat library.
참고URL : https://stackoverflow.com/questions/337/xml-processing-in-python
'UFO ET IT' 카테고리의 다른 글
Git에서 콜론 (: (0) | 2020.11.11 |
---|---|
사용자 지정 PyCharm 독 스트링 스텁 (예 : Google 독 스트링 또는 numpydoc 형식 용) (0) | 2020.11.11 |
JavaScript 정규식 및 하위 일치 (0) | 2020.11.11 |
virtualenv, mysql-python, pip : 누구든지 방법을 알고 있습니까? (0) | 2020.11.11 |
"foos 수"변수에 대한 명명 규칙 (0) | 2020.11.11 |