>

XML에서 특정 데이터 포인트를 추출하려고하는데 두 가지 옵션을 시도했습니다 ...

<올>
  • ElementTree를 사용한 XML 형식 작업
  • xmltodict를 사용한 사전 작업
  • 여기까지 내가 얻은 것

    코드

    # Packages
    # --------------------------------------
    import xml.etree.ElementTree as ET
    # XML Data
    # --------------------------------------
    message_xml = \
    '<ClinicalDocument> \
        <code code="34133-9" displayName="Summarization of Episode Note"/> \
        <title>Care Summary</title> \
        <recordTarget> \
            <patientRole> \
                <id assigningAuthorityName="LOCAL" extension="L123456"/> \
                <id assigningAuthorityName="SSN" extension="788889999"/> \
                <id assigningAuthorityName="GLOBAL" extension="G123456"/> \
                <addr use="HP"> \
                    <streetAddressLine>1000 N SOME AVENUE</streetAddressLine> \
                    <city>BIG CITY</city> \
                    <state>NA</state> \
                    <postalCode>12345-1010</postalCode> \
                    <country>US</country> \
                </addr> \
                <telecom nullFlavor="NI"/> \
                <patient> \
                    <name use="L"> \
                        <given>JANE</given> \
                        <given>JOE</given> \
                        <family>DOE</family> \
                    </name> \
                </patient> \
            </patientRole> \
        </recordTarget> \
    </ClinicalDocument>'
    # Get Tree & Root
    # --------------------------------------
    tree = ET.ElementTree(ET.fromstring(message_xml))
    root = tree.getroot()
    # Iterate
    # --------------------------------------
    for node in root:
        tag = node.tag
        attribute = node.attrib
        # Get ClinicalDocument.code values
        if tag == 'code':
            document_code_code = attribute.get('code')
            document_code_name = attribute.get('displayName')
        else:
            pass
        # Get ClinicalDocument.recordTarget values
        if tag == 'recordTarget':
            for child in node.iter():
                # Multiple <id> tags
                record_target_local = ??
                record_target_ssn = ??
                record_target_global = ??
                # Multiple <given> tags
                record_target_name_first = ??
                record_target_name_middle = ??
                record_target_name_last = ??
        else:
            pass
    
    

    예상 결과

    document_code,document_name,id_local,id_ssn,id_global,name_first, name_middle,name_last
    34133-9,Summarization of Episode Note,L123456,788889999,G123456,JANE,JOE,DOE
    
    

    허용 가능한 출력

    document_code,document_name,id_type,id,name_first,name_middle,name_last
    34133-9,Summarization of Episode Note,LOCAL,L123456,JANE,JOE,DOE
    34133-9,Summarization of Episode Note,SSN,788889999,JANE,JOE,DOE
    34133-9,Summarization of Episode Note,GLOBAL,G123456,JANE,JOE,DOE
    
    

    질문

    <올>
  • 여러 개의 자식 노드가있는 자식 노드를 효율적으로 탐색하는 방법
  • 중복 태그를 처리하는 방법 (예 : <id> <given> )?

    • 답변 # 1

      와이즈 비즈

      XML을 탐색하는 좋은 방법은 XPath를 사용하는 것입니다. ElementTree는 XPath 지원이 제한되어 있지만 필요한만큼 충분합니다. 더 복잡한 XPath를 사용해야하는 경우 lxml에서 XPath를 사용하는 것이 좋습니다.

      와이즈 비즈 와이즈 비즈

      How to efficiently navigate child-nodes with multiple child-nodes under them?

      )?

      이러한 요소로 무엇을해야하는지에 달려 있습니다. 예를 들어, 각

      How to handle duplicate tags (ex: 에 대해 별도의 행을 원할 경우  요소, 각 요소를 반복해야합니다 ( <id> 사용)  ElementTree 또는 <given> 에서  lxml에서).

      값 (텍스트 또는 속성 값) 만 원하는 경우 XPath의 단일 요소로 범위를 좁혀 야합니다.

      예 : id   findall() 를 가진 요소   xpath() 와 같은 속성 값   id 것입니다 .

      와이즈 비즈  요소는 조금 까다 롭습니다. 하나는 이름이고 하나는 중간 이름이라고 어떻게 알 수 있습니까? 내가 볼 수있는 유일한 방법은 위치입니다. 첫 번째 assigningAuthorityName  (와이즈 와이즈) )는 이름과 두 번째 LOCAL 입니다  (와이즈 와이즈) )는 두 번째 이름입니다. 항상 두 개의 id[@assigningAuthorityName='LOCAL'] 를 가지고 있다고 보장됩니까?  집단? 그렇지 않은 경우 필요한 출력을 얻기 위해 몇 가지 점검 또는 시도/제외 명령문을 수행해야 할 수도 있습니다.

      또한 csv 출력을 생성하므로 csv 모듈을 사용하는 것이 좋습니다. 구체적으로 DictWriter.

      이렇게하면 XML의 값을 dict에 저장하여 행을 쓸 수 있습니다. given 와 같은 공통 값을 유지하면서 새 행에 대한 새 dict 사본을 작성할 수 있습니다.  그리고 given ).

      다음은 각 given[1] 에 대해 새 행을 작성하는 예제입니다. .

      XML 입력(input.xml)

      given
      
      

      파이썬

      given[2]
      
      

      CSV 출력(output.csv)

      given
      
      

      다음은 각 recordTarget/patientRole/id에 대해 새 행을 만드는 다른 예입니다 ...

      파이썬

      document_code
      
      

      CSV 출력(output.csv)

      document_name
      
      
      recordTarget

  • 이전 r - Rstudio에서 간단한 XML 코드를 실행 한 후 오류가 발생 함
  • 다음 javascript - Google Script에서 HTTP 응답을 시도/취득하는 가장 좋은 방법