2014-05-15 3 views
3

XML 파서에서 작업하고 있습니다. 목표는 접두사와 태그가 일관성을 유지하지만 네임 스페이스가으로 바뀌는 수많은 xml 파일 을 파싱하는 것입니다.Python에서 xbrl 파일 구문 분석

내가 따라서 시도하고 다음 중 하나를

  • 는 네임 스페이스 접두사를 해결 (교체)하지 않고 단지 <prefix:tags>하여 XML을 구문 분석합니다. 접두어는 문서간에 변경되지 않습니다.
  • 은 식별자 (<prefix:tag>)가 적절한 네임 스페이스로 바뀔 수 있도록 네임 스페이스를 자동으로로드합니다.
  • 는 태그
  • 내가 xml.etree.ElementTree으로 시도

하여 XML을 구문 분석합니다.

나는 또한 저자가 lxml 나를 위해 네임 스페이스를 수집 할 수 있어야한다고 제안 어디 대답을 읽을 수 here 있지만 나를 도울 수 LXML에서 XMLParser의 모든 구성 옵션을 찾을 수 없습니다 lxml 살펴했다 자동으로

흥미롭게도, parsed_file = etree.XML(file) 오류와 함께 실패합니다 내가 분석 할 파일의

lxml.etree.XMLSyntaxError: Start tag expected, '<' not found, line 1, column 1 

한 예입니다 here

+0

'items = tree.xpath ("* [local-name (.) = 'a_tag_goes_here']")'이 작업을하고있는 것처럼 보입니다. – NoIdeaHowToFixThis

답변

1
items = tree.xpath("*[local-name(.) = 'a_tag_goes_here']") 

이 작업을 수행했습니다. 그 위에 나는 생성 된리스트 items을 수동으로 검색하여 다른 원하는 필터링 기능을 정의해야했습니다.

2
전체 네임 스페이스

신경, NS 접두사에 대해 걱정하지 마십시오

언젠가, 사람들은 짧은 접두사에 신경을 쓰며 잊어 버리며, 이차적으로 중요합니다. 그것들은 정규화 된 네임 스페이스에 대한 짧은 참조 일뿐입니다. 예 : 지금부터 XML 수단에

xmlns:trw="http://www.trw.com/20131231" 

은의 "trw:"는 정규화 된 네임 스페이스 "http://www.trw.com/20131231"을 의미합니다. 이 접두사는 다음 요소의 다른 네임 스페이스로 다시 정의 될 수 있으며 완전히 다른 의미를 가질 수 있습니다.

한편, 실제 의미에 대해 신경 쓰면 여기에 정규화 된 네임 스페이스가 의미하는 바, "trw:row""{http://www.trw.com/20131231}row"으로 생각할 수 있습니다. 이 번역 된 의미는 신뢰할 수 있으며 접두사 변경으로 변경되지 않습니다.

XML 파싱

http://edgar.sec.gov/Archives/edgar/data/1267097/000104746914000925/trw-20131231.xml에 링크 xmlstarlet하여 검증하고 lxml 파싱 할 수있는 XML, 리드를 언급.

표시되는 오류 메시지는 스트림의 첫 번째 문자를 나타내는 것이므로 파일의 BOM 바이트를 만나거나 gzip으로 압축 된 파일을 먼저 읽으려고합니다.

LXML 및 네임 스페이스 잘 네임 스페이스와

lxml 작품. 네임 스페이스를 사용하는 XPath 식을 사용할 수 있습니다. 출력시 이름 공간 접두사를 제어하면 일련 화 된 문서의 일부인 xmlns 속성에 종속되므로 조금 더 복잡합니다.접두어를 수정하려면 이러한 모든 요소를 ​​루트 요소로 이동하여 이러한 어트리뷰트를 구성해야합니다. 동시에 lxml은 각 요소의 정규화 된 네임 스페이스를 추적하므로 직렬화의 순간에이 네임 스페이스에 대한 현재 유효한 접두사와이 전체 이름을 존중합니다.

xmlna 속성을 처리하는 데 더 많은 코드가 필요합니다 (lxml 문서 참조).

관련 문제