2014-01-21 4 views
0

중첩 포함합니다 :나는 테이블과 같이이 반복 요소

Award | Name  | Amount 
Gold | John  | $5 
Gold | Karen | $5 
Gold | Clyde | $4 
Silver | Blake | $3 

나는이 같은 XML 출력을 찾고 있어요 : (그래서 일치하는 데이터 1 열에는 해당 데이터가 표는 액세스 데이터베이스에서 유래 형제 요소

<prize> 
<award>gold</award> 
<awardee> 
    <name>John</name> 
    <amount>$5</amount> 
</awardee> 
<awardee> 
    <name>Karen</name> 
    <amount>$4</amount> 
</awardee> 
<awardee> 
    <name>Clyde</name> 
    <amount>$3/amount> 
</awardee> 
</prize> 
<prize> 
<award>silver</award> 
... 

반복으로 처리하여, 하나 개의 요소로 취급되며, CSV로 수출되었다. 나는 엑셀 및 수출 등으로이 스키마를 가져 오는 시도했습니다 xml이지만 던져진 오류는 "목록 위트로 인해 XML을 내보낼 수 없습니다 "나는 이것에 대해 어떻게해야하는지에 대한 힌트를 원한다. 그러나 나는 어디서부터 시작해야 할까?

+2

특히 다른 언어에 익숙하십니까? 이것은 여러 가지 방법으로 수행 될 수 있습니다. – JNYRanger

+0

저는 PHP에 대해 가장 잘 알고 있습니다. 내게 던져 버릴 부분은 FOREACH가 1 열의 모든 데이터를 가져 오는 방법입니다. – psorensen

+1

죄송합니다. PHP 사용자가 아니지만 자바 또는 C# 옵션을 보여 드리게되어 기쁩니다. 누군가 나를 파이썬 예제로 때린 것 같습니다. – JNYRanger

답변

2

Python에 익숙하다면 lxml 모듈을 살펴볼 수 있습니다. 데이터가 my_data.csv (쉼표로 구분 된 값)이고 예제에있는 헤더 행이있는 경우이 코드는 트릭을 수행해야합니다 (Python 2.7에서 테스트되었지만 대부분의 Python 버전에서 작동 할 것입니다).

from lxml import etree 
from itertools import groupby 
import csv 

with open('my_data.csv') as data_file: 
    reader = csv.DictReader(data_file) 
    f = lambda x: x['Award'] 
    data = sorted(list(reader), key=f) 
    root = etree.Element('root') 
    for k, g in groupby(data, key=f): 
     prize = etree.SubElement(root, 'prize') 
     award = etree.SubElement(prize, 'award') 
     award.text = k 
     for entry in g: 
      awardee = etree.SubElement(prize, 'awardee') 
      name = etree.SubElement(awardee, 'name') 
      name.text = entry['Name'] 
      amount = etree.SubElement(awardee, 'amount') 
      amount.text = entry['Amount'] 

    with open('my_data.xml', 'wb') as out_file: 
     out_file.write(etree.tostring(root, pretty_print=True)) 

출력은 my_data.xml에 저장, 당신은 (별도의 루트 태그)를 원하는 것처럼 보인다.

<root> 
    <prize> 
    <award>Gold</award> 
    <awardee> 
     <name>John</name> 
     <amount>$5</amount> 
    </awardee> 
    <awardee> 
     <name>Karen</name> 
     <amount>$5</amount> 
    </awardee> 
    <awardee> 
     <name>Clyde</name> 
     <amount>$4</amount> 
    </awardee> 
    </prize> 
    <prize> 
    <award>Silver</award> 
    <awardee> 
     <name>Blake</name> 
     <amount>$3</amount> 
    </awardee> 
    </prize> 
</root> 
2

XML 핵심에서 사전에 어떤 도움

덕분에, 미리 정의 된 행동에 어떤 곳이 없습니다.

  1. 당신은 당신은 또한 당신의 비즈니스 로직에 대한 역할을 소비하는 코드를 정의 할 필요가 당신의 스타일
  2. 에 따라 그것을 정의 할 필요가있다. (을 당신의 스타일에 따라)

존재 둘 다 너다. 좋아요, 현재 문제에서는 <prize>을 감싸는 부모 요소를 넣어야합니다. 그렇지 않으면 xml을 기본 규칙으로 오류를 발생시키고 두 개 이상의 루트 요소를 피합니다. (그리고에는 루트 요소가 포함되어 있어야하며 하나만 있습니다.)

액세스 등에서 내보내는 동안이 점을주의하십시오. 액세스 데이터베이스를 제어 할 수있는 경우 SELECT CONCAT("<ROOT_ELEMENT>", YOUR DATA, "</ROOT_ELEMENT>")과 같은 쿼리를 선택할 수 있습니다. 또는 Excel에서 내보내기 전에 루트 요소를 추가하고 끝에 닫습니다. 데이터를 데이터베이스에 삽입하는 동안 적어도 랩된 루트 요소를 어떻게 든 추가해야합니다.