복붙노트

[PYTHON] ElementTree 요소에서 줄 번호를 가져 오는 방법이 있나요?

PYTHON

ElementTree 요소에서 줄 번호를 가져 오는 방법이 있나요?

그래서 파이썬 3.2.1의 cElementTree를 사용하여 XML 파일을 파싱 할 때 파싱하는 동안 일부 태그에 속성 정보가 누락되어 있음을 발견했습니다. xml 파일에서 해당 요소의 줄 번호를 가져 오는 쉬운 방법이 있는지 궁금합니다.

해결법

  1. ==============================

    1.문서를 보면 cElementTree를 사용하여이 작업을 수행 할 방법이 없습니다.

    문서를 보면 cElementTree를 사용하여이 작업을 수행 할 방법이 없습니다.

    그러나 lxmls 버전의 XML 구현에는 운이 좋았습니다. 그것은 libxml2를 사용하여 거의 대체품이 될 것으로 예상됩니다. 그리고 요소에는 sourceline 특성이 있습니다. (뿐만 아니라 다른 XML 기능을 많이 받고).

    단지주의해야 할 점은 파이썬 2.x에서만 사용했다는 것입니다. - 어떻게 3.x에서 작동하는지 모르겠지만 - 한 번해볼 가치가 있습니다.

    추가: 그들의 첫 페이지에서 그들은 말한다 :

    그래서 파이썬 3.x는 괜찮아 보인다.

  2. ==============================

    2.Python 3.x (3.3.2 사용)를 사용하여이 작업을 수행하는 방법에 대해 잠시 생각해 보았습니다. 요약하면 다음과 같습니다.

    Python 3.x (3.3.2 사용)를 사용하여이 작업을 수행하는 방법에 대해 잠시 생각해 보았습니다. 요약하면 다음과 같습니다.

    # Force python XML parser not faster C accelerators
    # because we can't hook the C implementation
    sys.modules['_elementtree'] = None
    import xml.etree.ElementTree as ET
    
    class LineNumberingParser(ET.XMLParser):
        def _start_list(self, *args, **kwargs):
            # Here we assume the default XML parser which is expat
            # and copy its element position attributes into output Elements
            element = super(self.__class__, self)._start_list(*args, **kwargs)
            element._start_line_number = self.parser.CurrentLineNumber
            element._start_column_number = self.parser.CurrentColumnNumber
            element._start_byte_index = self.parser.CurrentByteIndex
            return element
    
        def _end(self, *args, **kwargs):
            element = super(self.__class__, self)._end(*args, **kwargs)
            element._end_line_number = self.parser.CurrentLineNumber
            element._end_column_number = self.parser.CurrentColumnNumber
            element._end_byte_index = self.parser.CurrentByteIndex
            return element
    
    tree = ET.parse(filename, parser=LineNumberingParser())
    
  3. ==============================

    3.ElementTree.XMLTreeBuilder를 하위 클래스 화하여 elementtree에서이 작업을 수행했습니다. 그런 다음 self._parser (Expat)에 액세스 할 수있는 곳은 _parser.CurrentLineNumber 및 _parser.CurrentColumnNumber 속성이 있습니다.

    ElementTree.XMLTreeBuilder를 하위 클래스 화하여 elementtree에서이 작업을 수행했습니다. 그런 다음 self._parser (Expat)에 액세스 할 수있는 곳은 _parser.CurrentLineNumber 및 _parser.CurrentColumnNumber 속성이 있습니다.

    http://docs.python.org/py3k/library/pyexpat.html?highlight=xml.parser#xmlparser-objects에는 이러한 속성에 대한 세부 정보가 있습니다.

    파싱하는 동안 정보를 출력하거나 출력 XML 요소 속성에이 값을 넣을 수 있습니다.

    XML 파일에 추가 XML 파일이 포함되어 있다면 기억이 안 나는 항목을 수행해야하며 현재 XML 파일을 추적하기 위해 문서화되지 않았습니다.

  4. ==============================

    4.이 작업을 수행하는 한 가지 방법은 파싱하기 전에 각 요소에 줄 번호를 포함하는 더미 특성을 삽입하는 것입니다. 여기 내가 미니멈으로 어떻게 했는가?

    이 작업을 수행하는 한 가지 방법은 파싱하기 전에 각 요소에 줄 번호를 포함하는 더미 특성을 삽입하는 것입니다. 여기 내가 미니멈으로 어떻게 했는가?

    파이썬보고 라인 / XML 노드의 원점 컬럼

    이것은 cElementTree (또는 사실 다른 파이썬 XML 파서)에 간단히 적용될 수 있습니다.

  5. from https://stackoverflow.com/questions/6949395/is-there-a-way-to-get-a-line-number-from-an-elementtree-element by cc-by-sa and MIT license