xml.parsers.expat — Expat 을 사용한 빠른 XML 파싱

xml.parsers.expat — Expat 을 사용한 빠른 XML 파싱

xml.parsers.expat 모듈은 비검증(non-validating) XML 파서인 Expat 에 대한 파이썬 인터페이스예요. 이 모듈은 XML 파서의 현재 상태를 나타내는 단일 확장 타입 xmlparser 를 제공해요. xmlparser 객체를 만든 뒤 객체의 다양한 속성을 핸들러 함수로 설정할 수 있어요. XML 문서가 파서에 공급되면 그 문자 데이터와 마크업에 대해 핸들러 함수가 호출돼요.

출처: Python documentation

본문

이 모듈은 Expat 파서 접근을 제공하는 pyexpat 모듈을 사용해요. pyexpat 모듈을 직접 사용하는 것은 비권장(deprecated)이에요.

참고: 신뢰할 수 없거나 인증되지 않은 데이터를 파싱해야 한다면 XML 보안을 참고하세요.

예외, 타입 객체, 데이터 항목

  • exception xml.parsers.expat.ExpatError — Expat 이 오류를 보고할 때 발생하는 예외.
  • exception xml.parsers.expat.errorExpatError 의 별칭.
  • xml.parsers.expat.XMLParserTypeParserCreate() 함수의 반환 값 타입.
  • xml.parsers.expat.EXPAT_VERSION — 인터프리터가 로드한 Expat 라이브러리의 버전 문자열(예: 'expat_2.8.4').
  • xml.parsers.expat.version_info — 로드된 Expat 버전을 (major, minor, micro) 세 정수 튜플로.
  • xml.parsers.expat.features — 로드된 Expat 라이브러리가 컴파일된 기능 목록을 (name, value) 쌍으로.

함수 (Functions)

  • xml.parsers.expat.ErrorString(errno) — 주어진 오류 번호 errno 에 대한 설명 문자열을 반환해요.
  • xml.parsers.expat.ParserCreate(encoding=None, namespace_separator=None, intern=None) — 새 xmlparser 객체를 만들어 반환해요. encoding 은 XML 데이터가 사용하는 인코딩을 말하는 문자열이어야 해요. Expat 은 파이썬만큼 많은 인코딩을 지원하지 않으며 UTF-8, UTF-16, ISO-8859-1(Latin1), ASCII 를 지원해요.
    • ParserCreate() 로 만든 파서는 부모 파서가 없어 "루트" 파서라고 불러요. 비루트 파서는 parser.ExternalEntityParserCreate 로 만들어요.
    • Expat 은 namespace_separator 값을 제공하면 XML 네임스페이스 처리를 선택적으로 할 수 있어요. 값은 한 문자 문자열이어야 하며, 불법 길이면 ValueError 가 발생해요. 네임스페이스 처리가 활성화되면 네임스페이스에 속하는 요소 타입 이름과 속성 이름이 확장돼요.
    • intern 은 주어지면 요소·속성 이름을 intern 하는 데 사용되는 딕셔너리여야 해요.
    • pyexpat 가 사용하는 Expat 라이브러리의 제한 때문에 반환된 xmlparser 인스턴스는 단일 XML 문서만 파싱할 수 있어요. 문서마다 ParserCreate 를 호출해 고유한 파서 인스턴스를 제공하세요.

XMLParser 객체 (XMLParser Objects)

xmlparser 객체는 다음 메서드를 가져요.

  • xmlparser.Parse(data[, isfinal])data 의 내용을 파싱해 적절한 핸들러 함수를 호출해요. data 는 bytes-like 객체나 문자열일 수 있어요. 문자열이면 XML 데이터의 인코딩 선언이 무시되고 이미 디코딩된 텍스트로 파싱돼요. isfinal 은 이 메서드의 마지막 호출에서 참이어야 해요.
  • xmlparser.ParseFile(file) — 객체 file 에서 읽으며 XML 데이터를 파싱해요. fileread(nbytes) 메서드만 제공하면 되며, 더 이상 데이터가 없을 때 빈 bytes 객체를 반환해야 해요. 텍스트 파일은 지원되지 않으며 이미 디코딩된 데이터는 Parse() 를 사용하세요.
  • xmlparser.SetBase(base) — 선언의 시스템 식별자에서 상대 URI 를 해석하는 데 사용할 베이스를 설정해요.
  • xmlparser.GetBase() — 이전 SetBase() 호출로 설정된 베이스를 포함하는 문자열을 반환하거나, 호출된 적이 없으면 None 을 반환해요.
  • xmlparser.GetInputContext() — 현재 이벤트를 생성한 입력 데이터를 bytes 객체로 반환해요. 이벤트 핸들러가 활성 상태가 아닐 때 호출하면 None.
  • xmlparser.ExternalEntityParserCreate(context[, encoding]) — 부모 파서의 내용에서 참조되는 외부 파싱 엔티티를 파싱하는 데 사용할 수 있는 "자식" 파서를 만들어요.
  • xmlparser.SetParamEntityParsing(flag) — 매개변수 엔티티(외부 DTD 하위 집합 포함)의 파싱을 제어해요. 플래그 값은 XML_PARAM_ENTITY_PARSING_NEVER, XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE, XML_PARAM_ENTITY_PARSING_ALWAYS.
  • xmlparser.UseForeignDTD([flag]) — 참 값으로 호출하면 Expat 이 모든 인자에 None 을 주고 외부 엔티티 핸들러를 호출해 대체 DTD 를 로드하도록 해요.
  • xmlparser.SetReparseDeferralEnabled(enabled) — Expat 2.6.0 의 "재파싱 연기(reparse deferral)" 보안 메커니즘을 제어해요. False 로 호출하면 현재 Expat 파서 인스턴스에 대해 재파싱 연기를 비활성화해요. 보안 영향이 있으므로 주의해 사용해야 해요.

오류 코드 (Error codes)

xml.parsers.expat.errors 모듈은 XML_ERROR_* 상수들을 제공해요. 예를 들어:

  • XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING — 파싱 시작 후 변경할 수 있는 동작 변경을 요청했을 때(UseForeignDTD() 만 발생).
  • XML_ERROR_UNBOUND_PREFIX — 네임스페이스 처리가 활성화됐을 때 선언되지 않은 접두사를 발견.
  • XML_ERROR_AMPLIFICATION_LIMIT_BREACH — 입력 증폭 인자(DTD 및 엔티티에서) 한도를 위반.
  • XML_ERROR_SUSPENDED — 일시 중단된 파서에 허용되지 않는 연산을 요청.

errors.codes 딕셔너리로 오류 코드를 매핑할 수 있어요.

더 알아보기 (Learn more)