문제

나는 XML 문서를 구성하여 웹 서비스에 게시해야 하는 프로젝트의 일부를 구축하려고 하며, 내 기술을 확장하기 위한 수단으로 Python에서 이를 수행하고 싶습니다.

불행하게도 저는 .NET의 XML 모델을 상당히 잘 알고 있지만 Python의 XML 모델에 대한 장단점이 무엇인지 잘 모르겠습니다.

Python에서 XML 처리를 해본 경험이 있는 사람이 있나요?어디서부터 시작하라고 제안하시겠습니까?제가 만들 XML 파일은 매우 간단합니다.

도움이 되었습니까?

해결책

개인적으로 저는 XML이 많은 프로젝트에 내장된 여러 옵션을 사용해 본 결과 다음과 같이 결정했습니다. 풀덤 덜 복잡한 문서에 가장 적합한 선택입니다.

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

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

다른 팁

요소트리 멋진 Pythony API가 있습니다.나는 그것이 Python 2.5의 일부로 배송되었다고 생각합니다.

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

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

Python으로 간단하고 패키지화하려는 경우 minidom이 답이지만 꽤 형편없고 문서는 "여기 DOM에 대한 문서가 있습니다. 가서 알아보세요"입니다.정말 짜증나네요.

개인적으로 저는 돔형 모델인 ElementTree를 보다 빠르게(c 기반) 구현한 cElementTree를 좋아합니다.

나는 색소폰 시스템을 사용해 왔고 여러 면에서 그 느낌이 더 "파이썬적"이지만 일반적으로 이를 처리하기 위해 상태 기반 시스템을 만들게 되는데, 그러면 광기(및 버그)가 발생하게 됩니다.

연구를 좋아한다면 minidom을 선택하고, 잘 작동하는 좋은 코드를 원한다면 ElementTree를 선택하세요.

저는 여러 프로젝트에 ElementTree를 사용해왔고 추천합니다.

Python 기반이며 순수 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 작성기를 작성할 필요가 없습니다.

당신은 또한 시도할 수 있습니다 풀다 간단한 XML 문서를 구문 분석합니다.

"아주 간단한" XML을 구축할 것이라고 언급하셨기 때문에 미니돔 모듈 (Python 표준 라이브러리의 일부)이 귀하의 요구에 적합할 것입니다.XML의 DOM 표현에 대한 경험이 있다면 API가 매우 간단하다는 것을 알게 될 것입니다.

나는 XML 요청을 받고 XML 응답을 생성하는 SOAP 서버를 작성합니다.(아쉽게도 제 프로젝트가 아니어서 클로즈드 소스인데 그건 또 다른 문제입니다.)

스키마에 "맞는" 데이터 구조가 있으면 (SOAP) XML 문서를 만드는 것이 상당히 간단하다는 사실이 밝혀졌습니다.

응답 봉투는 요청 봉투와 (거의) 동일하므로 봉투를 보관합니다.그런 다음 내 데이터 구조가 (중첩된) 사전이므로 이 사전을 <key>value</key> 항목으로 바꾸는 문자열을 만듭니다.

이는 재귀를 통해 간단하게 수행되는 작업이며 올바른 구조로 끝납니다.이 작업은 모두 Python 코드로 수행되며 현재 프로덕션 용도로 사용하기에 충분히 빠릅니다.

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

나에게는 사전이 일부 사용자 정의 클래스보다 작업하기 훨씬 쉬운 방법이기 때문에 이것이 훨씬 더 간단했습니다.책의 경우 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: &lt;spam&amp;egg&gt;.</p>
  </body>
</html>

나는 E-Factory에 대해 다음과 같은 점에 감사드립니다.

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

가독성이 중요합니다.

모든 XML 콘텐츠 생성 가능

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

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

목록을 사용하여 매우 읽기 쉬운 구성을 허용합니다.

예:

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을 몇 분의 1초 내에 설치하는 방법.

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

나는 강력히 추천한다 SAX - Simple API for XML - Python 라이브러리에서 구현.그들은 대규모로 설정하고 처리하기가 매우 쉽습니다. XML 짝수 구동으로 API, 이전 포스터에서 설명한 것처럼 유효성 검사와 달리 메모리 공간이 적습니다. DOM 스타일 XML 파서.

나는 XML을 처리하는 .Net 방식이 일부 MSXML 버전을 기반으로 구축되었다고 가정하고, 이 경우 minidom 등을 사용하면 어느 정도 편안함을 느낄 수 있을 것이라고 가정합니다.그러나 간단한 처리라면 어떤 라이브러리에서든 수행할 수 있을 것입니다.

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

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