2008-09-17 6 views
3

SQL 결과 집합을 XML로 serialize 및/또는 변환 할 수있는 도구를 찾고 있습니다. SQL 결과 집합에서 XML 생성을 간단하고 간단하게 수행 할 수 있지만 필자가 필요로하는 것은 아닙니다.SQL 결과 집합을 XML로 변환

솔루션은 데이터베이스 중립적이어야하며 일반적인 SQL 쿼리 결과 만 허용합니다 (db xml 지원 사용 안 함). 이 도구의 특정 문제는 행 기반 결과의 스키마와 일치하는 중첩 된 XML을 제공하는 것입니다. 중급 단계는 너무 느리고 낭비입니다. 한 단계로 처리해야합니다. RS-> 객체 -> XML이 아니며, RS-> XML-> XSLT-> XML이없는 것이 더 바람직합니다. 큰 결과 세트, 큰 XML로 인해 스트리밍을 지원해야합니다.

아무 것도 없습니까?

+0

어떤 플랫폼, 언어입니까? – UnkwnTech

답변

2

SQL Server를 사용하면 FOR XML 구문을 쿼리에 사용하는 것이 좋습니다.

.Net을 사용하는 경우 DataAdapter를 사용하여 데이터 집합을 채우기 만하면됩니다. 일단 그것이 데이터 세트에 있으면, 그것의 .WriteXML() 메소드를 사용하십시오. 그건 당신의 DB-> 객체 - XML ​​규칙을 어기는 것이지만, 실제로 어떻게되는지를 설명합니다. 당신은 datareader로 뭔가를 할 수 있을지 모르지만, 나는 그것을 의심합니다.

+0

스키마를 사용하기 전에 'for XML'을 사용했습니다. 유일한 단점은 데이터베이스에 대한 성능 저하입니다. 스키마 바인딩을 사용하여 데이터 세트에서 XML을 작성하는 것은 옵션처럼 보입니다. 나는 그것을 시도 할 것이다. – tvaananen

+0

당신은 나에게 어떻게 보여줄 수 있었느냐? http://stackoverflow.com/questions/17051336/retrieve-sql-data-and-store-it-in-a-file-in-xml-format – Philo

2

아니요. 나는 내 자신을 굴릴뿐입니다. 그것은,이 같은 아마 뭔가를 그리 어려운 일이 아니다 :

#!/usr/bin/env jruby 

import java.sql.DriverManager 

# TODO some magic to load the driver 
conn = DriverManager.getConnection(ARGV[0], ARGV[1], ARGV[2]) 
res = conn.executeQuery ARGV[3] 

puts "<result>" 
meta = res.meta_data 
while res.next 
    puts "<row>" 

    for n in 1..meta.column_count 
    column = meta.getColumnName n 
    puts "<#{column}>#{res.getString(n)}</#{column}" 
    end  

    puts "</row>" 
end 
puts "</result>" 

면책 조항 : 난 그냥도 작동 척 귀찮게 아니에요, 그 모두를했다. :-)

+0

그래, 문제가 똑같이 간단하다면 이것은 간단한 해결책이 될 것이다. 필자는 기존 XML 스키마에 직접 매핑 할 수 있어야합니다. 이러한 스키마는 매우 복잡 할 수 있으며 어떤 경우에는 심층적 인 중첩이 필요합니다. XSLT는 중간 단계로 작동하지만 가능한 경우이를 피합니다. – tvaananen

+0

흠, 내가 무슨 뜻인지 알 것 같아. 나는 여전히 자신의 스크립트를 굴리는 것이 최선의 방법이라고 생각합니다. * this * 단순하지 않을 수도 있지만, 기존 도구를 사용하여 (분명히 구체적으로) 필요한 작업을하는 것보다 쉽습니다. –

0

dbunit (www.dbunit.org)은 sql에서 xml로, 그 반대의 경우도 마찬가지입니다. 필요에 따라 더 많이 수정할 수 있습니다.

2

.NET에서 모든 소스에서 데이터 집합을 채울 수 있으며 스키마가 있거나없는 XML로 디스크에 출력 할 수 있습니다. 큰 세트의 성능이 어떻다고 말할 수는 없습니다. Simple :)

0

기술적으로 XML 파일로 결과 집합을 변환하는 것은 간단하며 특정 내보내기 스키마에 맞게 데이터 구조를 변환해야하는 경우가 아니면 도구가 필요하지 않습니다. 일반적으로 결과 집합은 XML 파일의 최상위 요소를 가져온 다음 효과적으로 레코드의 필드 인 특성을 포함하는 여러 레코드 요소를 생성합니다.

예를 들어 Java와 관련하여 데이터베이스 독립성 요구 사항 (일반적으로 DBMS 공급 업체가 제공함)을 처리하는 데 필요한 DBMS와 인터페이스하기위한 적절한 JDBC 드라이버와 결과를 읽는 데 필요한 몇 줄의 코드 만 있으면됩니다 필드 당 레코드 당 XML 문자열을 설정하고 인쇄합니다. 내 의견으로는 일반 Java 개발자에게는 어려운 작업이 아닙니다.

어쨌든, 당신이 얻는 구체적인 대답을 더 구체적으로 기술하면됩니다.

0

자바에서는 개체를 XML 데이터 (예 : 엔터티 빈)로 채운 다음 XMLEncoder를 사용하여 xml로 가져올 수 있습니다. 거기에서 더 많은 변환을 위해 XSLT를 사용하거나 XMLDecoder를 사용하여 객체로 다시 가져올 수 있습니다.

Greetz, GHad

PS : JDBC, 그루비 데이터 집합 또는 GORM : 여러 많은 방법이 가능 Object로 DB에서 XML 부분에 개체 ...에 대한 예를 들어 http://ghads.wordpress.com/2008/09/16/java-to-xml-to-java/를 참조하십시오. Apache Common Beans는 Reflection과 같은 메소드를 통해 JavaBeans를 채울 수 있습니다.

0

결과 집합을 원본으로 사용하는 편지 병합과 병합 된 템플릿을 사용하여이 문제에 대한 해결책을 만들었습니다.

템플릿은 Header 요소, Footer 요소 및 Body 요소가있는 표준 XML입니다. Body 요소에서 CDATA 블록을 사용하면 각 행에 대한 템플릿으로 작동하는 완전한 XML 구조를 포함 할 수있었습니다. 결과 집합의 필드를 템플릿에 포함 시키려면이 <[FieldName]>과 같은 표식을 사용했습니다. 그런 다음 템플릿을 미리 구문 분석하여 마커를 격리하여 작동시 템플리트가 Body가 생성 될 때 결과 집합의 각 필드를 요청합니다.

머리글 및 바닥 글 요소는 출력 집합의 처음과 끝에 한 번만 출력됩니다. 본문은 원하는 XML 또는 텍스트 구조가 될 수 있습니다. 귀하의 경우에는 원하는 스키마마다 하나씩 여러 개의 템플리트가있는 것처럼 들립니다.

위의 모든 내용은 템플릿을로드 한 후 결과 집합을 매개 변수로 전달하는 템플릿에서 merge()이라는 템플릿 클래스로 캡슐화되었습니다.

+0

안녕하세요, stackoverflow. 여기에 대답으로 "코드를 이메일로 보내주십시오."라고 쓰는 것은 적절하지 않습니다. 대답은 독립적이어야하고 포함될 수있는 외부 참조보다 오래 지속될 수 있어야합니다. 귀하의 코드가 충분히 작아서 (또는 중요한 비트) 아마도이 답변에 맞을 것입니까? – Flexo

1

또 다른 옵션은 얼마나 많은 스키마를 출력해야하는지, 그리고이 솔루션이 어떻게 동적 인 지에 따라 다음 간단한 예제와 같이 실제로 SQL을 SQL 문에서 직접 작성하는 것입니다.

SELECT 
    '<Record>' || 
     '<name>' || name || '</name>' || 
     '<address>' || address || '</address>' || 
    '</Record>' 
FROM 
    contacts 

이 문서 요소를 앞에 추가하고 추가해야하지만이 예제는 이해하기 쉽습니다.