code

Python에서의 XML 처리

starcafe 2023. 9. 25. 22:52
반응형

Python에서의 XML 처리

XML 문서를 구축하고 웹 서비스에 게시해야 하는 프로젝트의 일부를 구축하려고 하는데, 이 프로젝트에서 제 기술을 확장하기 위한 수단으로 파이썬에서 수행하고자 합니다.

유감스럽게도, 제가 XML 모델을 잘 알고 있기는 하지만 말입니다.NET, 파이썬의 XML 모델에 대한 장단점이 무엇인지 잘 모르겠습니다.

파이썬에서 XML 처리를 해본 경험이 있는 사람?어디서부터 시작하면 좋을까요?제가 작성할 XML 파일은 상당히 간단할 것입니다.

개인적으로, 저는 XML이 많이 사용되는 프로젝트에서 몇 가지 내장 옵션을 가지고 놀았고 덜 복잡한 문서를 위한 최선의 선택으로 풀덤을 선택했습니다.

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

을 할 수 : .for콜백을 사용하는 대신 루프를 사용합니다. 구문 을 석(풀"분)다를 수 있습니다.expandNode()는 사용 " 있는"인 요구사항을 이는 사용 편의성과 단순성을 희생시키지 않으면서 "책임감 있는" 효율성에 대한 일반적인 요구사항을 충족합니다.

ElementTree에는 좋은 피소니 API가 있습니다.python 2.5의 일부로 배송된 것 같습니다.

그것은 순수한 파이썬에 있고 내가 말했듯이 꽤 좋지만 결국 더 많은 성능이 필요하게 된다면 lxml은 동일한 API를 노출하고 후드 아래에 libxml2를 사용합니다.이론적으로 필요할 때 교체할 수 있습니다.

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

Python과 함께 패키지로 간단하게 포장하고 싶다면 미니돔이 답이지만, 꽤 어설프고, 설명서는 "여기 dom에 관한 문서가 있으니 가서 알아보세요."입니다.정말 화가 나.

개인적으로 cElement를 좋아합니다.요소를 보다 빠르게(c 기반으로) 구현하는 트리돔과 같은 모델인 트리.

저는 색소 시스템을 사용해 보았는데, 많은 면에서 색소 시스템은 더 "피토닉"한 느낌이지만, 저는 대개 색소 시스템을 사용하기 위해 국가 기반 시스템을 만들고, 그렇게 되면 광기(그리고 버그)가 생기게 됩니다.

나는 만약 당신이 연구를 좋아한다면 미니돔을 사용하거나, 요소를 사용하라고 말합니다.잘 작동하는 좋은 코드를 원한다면 트리.

Element를 사용했습니다.여러 프로젝트에 대해 트리를 지정하고 이를 추천합니다.

pythonic이며, c 버전 cElement를 포함하여 Python 2.5와 함께 'in the box'로 제공됩니다.트리(xml.etree).cElementTree)는 순수 Python 버전보다 20배 빠르고 사용하기 매우 쉽습니다.

lxml은 성능상의 장점이 있지만 동일하지 않으며 사용 사례에 대한 벤치마크를 먼저 확인해야 합니다.

내가 알기론, 요소트리 코드를 lxml로 쉽게 포팅할 수 있습니다.

서류가 얼마나 복잡해야 하는지에 따라 조금씩 다릅니다.

저는 XML 작성에 미니돔을 많이 사용해 왔지만, 보통 문서를 읽고 간단한 변환을 한 후 다시 작성하는 것에 그쳤습니다.요소 특성을 주문하는 기능(XML을 제대로 구문 분석하지 않는 오래된 애플리케이션을 충족하는 기능)이 필요할 때까지 충분히 효과적이었습니다.그때 저는 포기하고 XML을 직접 작성했습니다.

간단한 문서만 작업하는 경우 프레임워크를 배우는 것보다 직접 작업하는 것이 더 빠르고 간단할 수 있습니다.할 수 할 수 것입니다(이 면,입니다).str.encode(codec, errors="xmlcharrefreplace")이러한 스내퍼스를 제외하고 XML은 특별한 라이브러리가 필요 없을 정도로 규칙적입니다.문서가 너무 복잡해서 수작업으로 작성할 수 없다면 이미 언급한 프레임워크 중 하나를 조사해야 할 것입니다.어떤 경우에도 일반 XML 작성기를 작성해야 합니다.

간단한 XML 문서를 구문 분석하기 위해 언탱글을 시도할 수도 있습니다.

"아주 간단한" XML을 구축할 것이라고 말씀하셨기 때문에 미니돔 모듈(Python Standard Library의 일부)이 고객의 요구에 적합할 것입니다.XML의 DOM 표현에 대한 경험이 있다면 API를 꽤 쉽게 찾을 수 있을 것입니다.

저는 XML 요청을 받고 XML 응답을 생성하는 SOAP 서버를 작성합니다. (아쉽게도 제 프로젝트가 아니기 때문에 비공개 소스이지만, 또 다른 문제입니다.)

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

응답 봉투가 요청 봉투와 (거의) 같아서 봉투를 보관하고 있습니다.그런 다음, 제 데이터 구조가 (네스팅 가능성이 있는) 사전이기 때문에 이 사전을 <key> value</key> 항목으로 변환하는 문자열을 만듭니다.

이것은 재귀를 간단하게 만드는 작업이고, 결국 저는 올바른 구조를 갖게 됩니다.이것은 모두 파이썬 코드로 이루어지며, 현재는 프로덕션용으로 충분히 빠릅니다.

또한 (상대적으로) 쉽게 목록을 만들 수 있지만, 고객에 따라 길이 힌트를 주지 않으면 문제가 발생할 수 있습니다.

저는 사전이 커스텀 클래스보다 훨씬 쉬운 작업 방식이기 때문에 이 작업이 훨씬 더 간단했습니다.책에서는 XML을 생성하는 것이 구문 분석보다 훨씬 쉽습니다!

Python의 XML에 대한 진지한 작업을 위해서는 lxml을 사용합니다.

Python은 Element와 함께 제공됩니다.트리 내장 라이브러리이지만 lxml은 속도와 기능 측면에서 확장됩니다(스킴 검증, 색스 파싱, 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: &lt;spam&amp;egg&gt;.</p>
  </body>
</html>

E-factory에서 여러가지를 따라다니면서 감사합니다.

코드는 거의 결과 XML 문서로 읽힙니다.

가독성이 중요합니다.

XML 컨텐츠를 만들 수 있습니다.

다음을 지원합니다.

  • 네임스페이스 사용
  • 하나의 요소 내에서 시작 및 종료 텍스트 노드
  • 함수속성 내용 형식 지정(전체 lxml 샘플의 func CLASS 참조)

목록이 있는 매우 읽기 쉬운 구성을 허용합니다.

예:

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)

결과:

<root>
  <record>alfa</record>
  <record>beta</record>
  <record>gama</record>
</root>

결론들

저는 lxml 튜토리얼을 읽는 것을 적극 추천합니다. 매우 잘 쓰여져 있고 이 강력한 라이브러리를 사용해야 하는 더 많은 이유를 알려줄 것입니다.

lxml의 유일한 단점은 컴파일해야 한다는 것입니다.휠 포맷 패키지에서 lxml을 설치하는 방법에 대한 자세한 팁은 SO 답변을 참조하십시오.

강력 추천합니다.SAX - Simple API for XML- Python 라이브러리에 구현할 수 있습니다.이들은 대규모 설치 및 처리가 상당히 용이합니다.XML동승하여API, 여기서 이전 포스터에서 논의한 바와 같이 유효성 검사와 달리 메모리 사용량이 적습니다.DOM스타일.XML파서

SOAP 메시지를 작성하려면 soaplib을 확인하십시오.Element를 사용합니다.후드 아래에 트리가 있지만 메시지의 직렬화 및 역직렬화를 위한 훨씬 더 깨끗한 인터페이스를 제공합니다.

제가 추측하기로는.XML을 처리하는 NET 방식은 MSXML의 일부 버전을 기반으로 하며, 그 경우에는 예를 들어 미니돔을 사용하면 어느 정도 편안함을 느낄 수 있을 것이라고 생각합니다.하지만, 만약 여러분이 하고 있는 간단한 처리라면, 어떤 도서관이든 아마 할 것입니다.

또한 Element와 함께 일하는 것을 선호합니다.Python에서 XML을 다룰 때는 매우 깔끔한 라이브러리이기 때문에 트리.

언급URL : https://stackoverflow.com/questions/337/xml-processing-in-python

반응형