2016-06-28 2 views
1

XML에서 가져온 Access 테이블이 있습니다. 내보낼 때 원래 XML 테이블과 동일한 XML 구조가 없습니다.VBA를 사용하여 Access Table을 XML로 내보내기

<?xml version="1.0" standalone="true"?> 
<profiling> 
    <program> 
    <name>118CDSpro</name> 
    <p1on>1</p1on> 
    <p1tool>36</p1tool> 
    <p2on>OFF</p2on> 
    <cut>OFF</cut> 
    <rule>OFF</rule> 
    <desc>118 Clad DirectSet Profile</desc> 
    <pic>akv.bmp</pic> 
    <ten>dilec_F</ten> 
    </program> 
<profiling/> 

이 내가 수출에서 무엇을 얻을 수 있습니다 : 다음과 같이

원래 수입 테이블 보이는

<?xml version="1.0" encoding="UTF-8"?> 
<dataroot generated="2016-06-27T12:16:29" xmlns:od="urn:schemas microsoft-com:officedata"> 
    <Profiling> 
    <name>Din_C92S_pro2</name> 
    <p1on>1</p1on> 
    <p1tool>40</p1tool> 
    <p2on>OFF</p2on> 
    <cut>OFF</cut> 
    <rule>OFF</rule> 
    <desc>Inswing Door Sash Profile 2 (Storm)</desc> 
    <ten>dilec_F</ten> 
    </Profiling> 
</dataroot> 

내가 문제가 끝내고 .xsl 파일 내에있는 생각하지만, 나는 새로운 오전 VBA로 보내고 어떻게 사용되는지 확신 할 수 없습니다.

이 코드는 원래 형식과 관련하여 매우 구체적입니다.

의견을 보내 주시면 감사하겠습니다.

옵션 2 코드 :

Sub ProfileXML2() 

    ' RAW XML EXPORT 
    Application.ExportXML acExportTable, "Profiling", "C:\MyData\Crafter 0610\Crafter\MACHINE\SCHEMAS\ProfileExport.xml" 


    ' TRANSFORM RAW XML (OPTION 2 - full XSLT processor) 
    Dim xmlDoc As Object, xslDoc As Object, newDoc As Object 

    Set xmlDoc = CreateObject("MSXML2.DOMDocument") 
    Set xslDoc = CreateObject("MSXML2.DOMDocument") 
    Set newDoc = CreateObject("MSXML2.DOMDocument") 

    ' LOAD XML AND XSL FILES 
    xmlDoc.Load "C:\MyData\Crafter 0610\Crafter\MACHINE\SCHEMAS\ProfileExport.xml" 
    xmlDoc.async = False 

    xslDoc.Load "C:\MyData\Crafter 0610\Crafter\MACHINE\SCHEMAS\ProfilingSchema.xsl" 
    xslDoc.async = False 

    ' TRANSFORM SOURCE TO FINAL 
    xmlDoc.transformNodeToObject xslDoc, newDoc 
    newDoc.Save "C:\MyData\Crafter 0610\Crafter\DATA\ProfilingTest.xml" 

    Set newDoc = Nothing 
    Set xslDoc = Nothing 
    Set xmlDoc = Nothing 

End Sub 

답변

1

는 현재 아무 문제가 없다. MS Access는 가져온 XML 파일 구조를 유지하지 않습니다. 받은 출력은 XML 형식의 테이블 또는 쿼리 출력의 표준 템플리트입니다. 그러나 최종 용도가이 원시 출력을 수용 할 수 없으므로 XSLT을 사용하는 것을 고려하십시오. 특수 목적 언어는 XML 문서를 변환하기 위해 설계되었습니다.

Application.TransformXML 또는 MSXML 라이브러리를 사용하여 XSLT를 실행할 수 있습니다. 아래 VBA 코드는 두 옵션을 모두 보여줍니다. 이 XSLT는 처음 두 템플릿 일치가 로컬 요소 이름을 반환하는 출력에서 ​​urn : schemas microsoft-com : officedata 네임 스페이스를 제거하기 때문에 특수 스크립트입니다.

XSLT 스크립트 (을 끝내고 .xsl VBA에로드 할로 저장)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="@*|node()"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="text()"> 
    <xsl:copy/> 
    </xsl:template> 

    <xsl:template match="dataroot">  
    <xsl:apply-templates select="Profiling"/>  
    </xsl:template> 

    <xsl:template match="Profiling"> 
    <profiling> 
     <program> 
     <xsl:apply-templates select="*"/> 
     </program> 
    </profiling> 
    </xsl:template> 

</xsl:stylesheet> 

VBA 스크립트

Public Sub XMLHandle() 

    ' RAW XML EXPORT 
    Application.ExportXML acExportTable, "TableName", "C:\Path\To\Raw\Output.xml" 

    ' TRANSFORM RAW XML (OPTION 1 - limited XSLT method)  
    Application.TransformXML "C:\Path\To\Raw\Output.xml", _ 
          "C:\Path\To\XSLT\Transform.xsl", _ 
          "C:\Path\To\Final\Output.xml" 

    ' TRANSFORM RAW XML (OPTION 2 - full XSLT processor) 
    Dim xmlDoc As Object, xslDoc As Object, newDoc As Object 

    Set xmlDoc = CreateObject("MSXML2.DOMDocument") 
    Set xslDoc = CreateObject("MSXML2.DOMDocument") 
    Set newDoc = CreateObject("MSXML2.DOMDocument") 

    ' LOAD XML AND XSL FILES 
    xmlDoc.Load "C:\Path\To\Raw\Output.xml" 
    xmlDoc.async = False 

    xslDoc.Load "C:\Path\To\XSLT\Transform.xsl" 
    xslDoc.async = False 

    ' TRANSFORM SOURCE TO FINAL 
    xmlDoc.transformNodeToObject xslDoc, newDoc 
    newDoc.Save "C:\Path\To\Final\Output.xml" 

    Set newDoc = Nothing 
    Set xslDoc = Nothing 
    Set xmlDoc = Nothing 

End Sub 

출력

<?xml version="1.0" encoding="UTF-8"?> 
<profiling> 
    <program> 
     <name>Din_C92S_pro2</name> 
     <p1on>1</p1on> 
     <p1tool>40</p1tool> 
     <p2on>OFF</p2on> 
     <cut>OFF</cut> 
     <rule>OFF</rule> 
     <desc>Inswing Door Sash Profile 2 (Storm)</desc> 
     <ten>dilec_F</ten> 
    </program> 
</profiling> 
+0

둘 다 테스트했고 첫 번째 옵션은 들여 쓰기가 없다는 사실 외에도 XML 데이터 테이블에 실제로 영향을주지 않는다고 생각합니다. 두 번째 옵션은 "하나의 최상위 요소 만 XML 문서에 허용됩니다"라는 오류 메시지가 나타납니다. 첫 번째 옵션이 훌륭하게 작동하므로 내 지식을 제외하고는별로 중요하지 않습니다. –

+0

좋아요! 답변이 도움이된다면 동의하십시오. 두 번째 옵션은 들여 쓰기가 적절합니다. 나는 그 오류를 재현 할 수 없다. 경로가 올바른 파일을 가리키는 지 확인하십시오. – Parfait

+0

저는 여전히 답변과 의견의 차이를 탐색하려고합니다. 나는 원래의 질문에 옵션 2와 관련하여 뭔가를 추가했다. 올바르게 코딩되지 않은 것이있다. –

관련 문제