2010-03-16 2 views
2

suds 라이브러리를 사용하여 Python 2.6에서 SOAP 웹 서비스를 구현하려고합니다. 그게 잘 작동하지만, 출력을 구문 분석하려고 할 때 문제가 생겼습니다. lxml.lxml로 파싱하기 전에 suds 출력에서 ​​XML 선언을 제거해야합니까?

배트는 SOAP 서비스의 응답과 suds.sax.text.Text 개체를 반환합니다. suds.sax.text.Text 클래스는 파이썬 내장 된 Unicode class의 하위 클래스입니다. (때문에 XML 선언이 맞다면, 내용이 UTF-8 인코딩 때문에, incongrous입니다

u'<?xml version="1.0" encoding="utf-8" ?><root><lotsofelements \></root>' 

, 따라서 하지 파이썬 유니 코드 개체 : 본질적으로,이 파이썬 문을 비교할 것 UCS4와 같은 내부 인코딩에 저장됩니다. 그것으로 해석해야하는 코드 전환에 대한 명확한 답이 없기 때문에

LXML이, as documented 구문 분석을 거부합니다.

  1. 벗겨 <?xml> 선언, 인코딩을 포함 : 제가보기에는

    이 바인드 중 두 가지 방법이있다.

  2. 지정된 인코딩을 사용하여 Suds의 출력을 bytestring으로 변환하십시오. 현재

, 나는이 웹 서비스에서 수신하고있어 데이터가 ASCII 범위 내에서, 그래서 어느 쪽이든은 작동하지만 모두가 나에게 추한 해킹처럼 매우 많이 느낀다, 나는 아주 확실하지 않다 어떤 것 더 넓은 범위의 유니 코드 문자가 필요한 데이터를 받기 시작하면 어떻게됩니까?

좋은 아이디어가 있습니까? 나는이 위치의 첫 번째 사람이라고 상상할 수 없다 ...

답변

2

당신과 lxml은 정확합니다; 유효한 XML 문서는 <?xml ..... 헤더 (기본값 : UTF-8)에 선언 된대로 인코딩 된 바이트 스트림이어야합니다.

나는 세 번째 옵션을 건의 할 것 : 인코딩 선언을 생략하지만, (미래의 안전) 거기에 버전을 잎하는 XML 헤더와 유니 코드에 둡니다. 그러면 lxml이 행복하게 유지되고 다시 인코딩하는 오버 헤드를 피할 수 있습니다.

나는 또한 비눗물 사이트에서 일부 부드러운 질문을 제시하고 자신의 소스에 주위에 포크를 가진 것입니다.

+0

단순히 인코딩 부분을 제거하는 것이 합리적인 방법이라고 생각합니다. 감사합니다. 필자는이 끔찍한 사건에 대한 픽스가 메인 라이브러리에 포함될만한 가치가 있는지 알아보기 위해 비눗물 녀석들을 치려고합니다. – mikl

1

흠, 현재 첫 번째 Suds 기반 솔루션을 구현하고 문제없이 lxml로 내 응답을 구문 분석하지만, 꽤 멍청하고 바보 같은 방식으로하고있다. 여기에 내 코드가 어떻게 표시되는지를 보여줍니다 같은 :

try: 
    result = self.client.service.ExportOwnersDetails(fAccess=self.access_id, fParams=params) 
except URLError: 
    # TODO: Log timeout here, handle 
    return 
response = str(result.fReturn) 

if len(response) == 0 or response.find('<?xml ') == -1: 
    # TODO: Log import error here, handle 
    return 
response = StringIO(response) 
xml = etree.parse(response) 

내가 말했듯이, 매우 영리한 (분명 내가 아직도 몇 가지 기록을 가지고),하지만 내 방식입니다. fAccess, fParams, fReturn nonsense는 내가 통합 할 타사 공급자의 명명 규칙입니다.

+0

글쎄, 당신은'(응답) etree.fromstring'대신 먼저 StringIO로 변환하는 데 사용할 수 (etree.parse() etree.fromstring 파일을 읽기위한 것입니다() 행복하게 문자열을 받아). 그러나 StringIO 변환은 내가하는 것과 같은 오류를 보지 못하는 이유 일 수 있습니다. – mikl

+0

Duh, 나는 너무 오래 lxml에서 벗어난 것을 알고있었습니다. fromstring() 나를 위해 잘 작동합니다. 질문을 주셔서 감사합니다. 제 코드를 정리할 수 있습니다. – Tom

관련 문제