2017-09-19 245 views
0

我需要将XML文件导入到Access数据库。我试过Application.ImportXML但是文件的结构是错误的。 进口后,我有3个表,但主表FormattedReportObject具有结构:将XML文件导入Access

“对象名”, “FormattedValue的” “价值”

我需要创建一个结构的表:

“Tytul” “z1Lpf1” “z1Iloscf1” “z1KodKreskowyf1” “z1SymbolTowaruf1”

值这个海峡ucture在列FormattedValue中。

Link to my website

回答

1

考虑使用XSLT,设计来转换XML文件中的专用语言。由于您的原始XML不会导入到所需的结构中,因此您需要转换原始XML以提取所需的数据。

具体而言,您必须将ObjectName文本作为新的XML元素传递,以便作为Access表中的列进行迁移。此外,XSLT仅过滤XML的详细信息部分,该部分保持完整的完整数据,而不包含任何空的列和行。

XSLT脚本(保存为.xsl文件一,在VBA加载一个特殊的完全有效的.xml文件)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
           xmlns:doc="urn:crystal-reports:schemas" 
           exclude-result-prefixes="doc"> 
    <xsl:output indent="yes" encoding="utf-8"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/doc:FormattedReport"> 
    <xsl:copy> 
     <xsl:apply-templates select="descendant::doc:FormattedReportObjects[doc:FormattedReportObject/doc:ObjectName='z1Lpf1']"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="doc:FormattedReportObjects"> 
    <xsl:element name="data" namespace="urn:crystal-reports:schemas">  
     <xsl:apply-templates select="doc:FormattedReportObject"/>  
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="doc:FormattedReportObject"> 
    <xsl:element name="{doc:ObjectName}" namespace="urn:crystal-reports:schemas"> 
     <xsl:value-of select="normalize-space(doc:Value|doc:TextValue)"/> 
    </xsl:element>  
    </xsl:template> 

</xsl:stylesheet> 

VBA

Public Sub XMLImportData() 
    ' ADD MSXML, v6.0 REFERENCE UNDER TOOLS 
    Dim xmlDoc As New MSXML2.DOMDocument60 
    Dim xslDoc As New MSXML2.DOMDocument60 
    Dim newDoc As New MSXML2.DOMDocument60 

    ' LOAD XML AND XSL FILES 
    xmlDoc.async = False 
    xmlDoc.Load "http://kumcio.cba.pl/546kopia.xml" 

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

    ' TRANSFORM XML 
    xmlDoc.transformNodeToObject xslDoc, newDoc 
    newDoc.Save "C:\Path\To\OutputXML.xml" 

    Application.ImportXML "C:\Path\To\OutputXML.xml" 

    Set xmlDoc = Nothing: Set xslDoc = Nothing: Set newDoc = Nothing 
End Sub 

输出

<?xml version="1.0" encoding="utf-8"?> 
<FormattedReport xmlns="urn:crystal-reports:schemas" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"> 
    <data> 
     <z1Lpf1>1.00</z1Lpf1> 
     <z1NazwaLubOpisf1>1.17003Świetlik 4,5 x 39 ziel</z1NazwaLubOpisf1> 
     <z1Iloscf1>100.00</z1Iloscf1> 
     <z1Jmf1>szt.</z1Jmf1> 
     <z1KodKreskowyf1>5902767311281</z1KodKreskowyf1> 
     <z1Wlasne1f1>382378</z1Wlasne1f1> 
     <z1Wlasne2f1>50</z1Wlasne2f1> 
     <z1SymbolTowaruf1>1.17003</z1SymbolTowaruf1> 
    </data> 
    <data> 
     <z1Lpf1>2.00</z1Lpf1> 
     <z1NazwaLubOpisf1>1.17004Świetlik 4,5 x 39 czer</z1NazwaLubOpisf1> 
     <z1Iloscf1>100.00</z1Iloscf1> 
     <z1Jmf1>szt.</z1Jmf1> 
     <z1KodKreskowyf1>5902767311298</z1KodKreskowyf1> 
     <z1Wlasne1f1>382381</z1Wlasne1f1> 
     <z1Wlasne2f1>50</z1Wlasne2f1> 
     <z1SymbolTowaruf1>1.17004</z1SymbolTowaruf1> 
    </data> 
    <data> 
     <z1Lpf1>3.00</z1Lpf1> 
     <z1NazwaLubOpisf1>1.17005Świetlik 4,5 x 39 nieb</z1NazwaLubOpisf1> 
     <z1Iloscf1>100.00</z1Iloscf1> 
     <z1Jmf1>szt.</z1Jmf1> 
     <z1KodKreskowyf1>5902767311304</z1KodKreskowyf1> 
     <z1Wlasne1f1>382386</z1Wlasne1f1> 
     <z1Wlasne2f1>50</z1Wlasne2f1> 
     <z1SymbolTowaruf1>1.17005</z1SymbolTowaruf1> 
    </data> 
    <data> 
     <z1Lpf1>4.00</z1Lpf1> 
     <z1NazwaLubOpisf1>3.01015Gł.jig 7g hacz 3/0</z1NazwaLubOpisf1> 
     <z1Iloscf1>5.00</z1Iloscf1> 
     <z1Jmf1>opak.</z1Jmf1> 
     <z1KodKreskowyf1>5902767315227</z1KodKreskowyf1> 
     <z1Wlasne1f1>382189</z1Wlasne1f1> 
     <z1Wlasne2f1>5</z1Wlasne2f1> 
     <z1SymbolTowaruf1>3.01015</z1SymbolTowaruf1> 
    </data> 
    <data> 
     <z1Lpf1>5.00</z1Lpf1> 
     <z1NazwaLubOpisf1>3.01013Gł.jig 7g hacz 1/0</z1NazwaLubOpisf1> 
     <z1Iloscf1>5.00</z1Iloscf1> 
     <z1Jmf1>opak.</z1Jmf1> 
     <z1KodKreskowyf1>5902767315203</z1KodKreskowyf1> 
     <z1Wlasne1f1>382177</z1Wlasne1f1> 
     <z1Wlasne2f1>5</z1Wlasne2f1> 
     <z1SymbolTowaruf1>3.01013</z1SymbolTowaruf1> 
    </data> 
    <data> 
     <z1Lpf1>6.00</z1Lpf1> 
     <z1NazwaLubOpisf1>3.02017Głowka jigowa micro7g</z1NazwaLubOpisf1> 
     <z1Iloscf1>5.00</z1Iloscf1> 
     <z1Jmf1>opak.</z1Jmf1> 
     <z1KodKreskowyf1>5902767311786</z1KodKreskowyf1> 
     <z1Wlasne1f1>382686</z1Wlasne1f1> 
     <z1Wlasne2f1>5</z1Wlasne2f1> 
     <z1SymbolTowaruf1>3.02017</z1SymbolTowaruf1> 
    </data> 
    <data> 
     <z1Lpf1>7.00</z1Lpf1> 
     <z1NazwaLubOpisf1>1.12054kotwiczka 4 gunsmoke</z1NazwaLubOpisf1> 
     <z1Iloscf1>10.00</z1Iloscf1> 
     <z1Jmf1>opak.</z1Jmf1> 
     <z1KodKreskowyf1>5902767310581</z1KodKreskowyf1> 
     <z1Wlasne1f1>382863</z1Wlasne1f1> 
     <z1Wlasne2f1>10</z1Wlasne2f1> 
     <z1SymbolTowaruf1>1.12054</z1SymbolTowaruf1> 
    </data> 
    <data> 
     <z1Lpf1>8.00</z1Lpf1> 
     <z1NazwaLubOpisf1>1.12055kotwiczka 2 gunsmoke</z1NazwaLubOpisf1> 
     <z1Iloscf1>10.00</z1Iloscf1> 
     <z1Jmf1>opak.</z1Jmf1> 
     <z1KodKreskowyf1>5902767310598</z1KodKreskowyf1> 
     <z1Wlasne1f1>382867</z1Wlasne1f1> 
     <z1Wlasne2f1>10</z1Wlasne2f1> 
     <z1SymbolTowaruf1>1.12055</z1SymbolTowaruf1> 
    </data> 
    <data> 
     <z1Lpf1>9.00</z1Lpf1> 
     <z1NazwaLubOpisf1>3.01014Gł.jig 7g hacz 2/0</z1NazwaLubOpisf1> 
     <z1Iloscf1>5.00</z1Iloscf1> 
     <z1Jmf1>opak.</z1Jmf1> 
     <z1KodKreskowyf1>5902767315210</z1KodKreskowyf1> 
     <z1Wlasne1f1>382182</z1Wlasne1f1> 
     <z1Wlasne2f1>5</z1Wlasne2f1> 
     <z1SymbolTowaruf1>3.01014</z1SymbolTowaruf1> 
    </data> 
    <data> 
     <z1Lpf1>10.00</z1Lpf1> 
     <z1NazwaLubOpisf1>3.01016Gł.jig 7g hacz 4/0</z1NazwaLubOpisf1> 
     <z1Iloscf1>5.00</z1Iloscf1> 
     <z1Jmf1>opak.</z1Jmf1> 
     <z1KodKreskowyf1>5902767315234</z1KodKreskowyf1> 
     <z1Wlasne1f1>382202</z1Wlasne1f1> 
     <z1Wlasne2f1>5</z1Wlasne2f1> 
     <z1SymbolTowaruf1>3.01016</z1SymbolTowaruf1> 
    </data> 
    <data> 
     <z1Lpf1>11.00</z1Lpf1> 
     <z1NazwaLubOpisf1>3.01017Gł.jig 7g hacz 5/0</z1NazwaLubOpisf1> 
     <z1Iloscf1>5.00</z1Iloscf1> 
     <z1Jmf1>opak.</z1Jmf1> 
     <z1KodKreskowyf1>5902767315241</z1KodKreskowyf1> 
     <z1Wlasne1f1>382210</z1Wlasne1f1> 
     <z1Wlasne2f1>5</z1Wlasne2f1> 
     <z1SymbolTowaruf1>3.01017</z1SymbolTowaruf1> 
    </data> 
    <data> 
     <z1Lpf1>12.00</z1Lpf1> 
     <z1NazwaLubOpisf1>3.04005Gł jig żół blaszka 6g</z1NazwaLubOpisf1> 
     <z1Iloscf1>5.00</z1Iloscf1> 
     <z1Jmf1>opak.</z1Jmf1> 
     <z1KodKreskowyf1>5902767311847</z1KodKreskowyf1> 
     <z1Wlasne1f1>382695</z1Wlasne1f1> 
     <z1Wlasne2f1>5</z1Wlasne2f1> 
     <z1SymbolTowaruf1>3.04005</z1SymbolTowaruf1> 
    </data> 
</FormattedReport> 

Imported Access Table

+0

我试试这个,但是我有错误。 运行时错误“31593”: MS Access在处理OutputXML.xml文件中的XML模式时遇到错误 该文档必须只包含一个根元素 – kumcio

+0

您实际上在根中有一个未声明的命名空间前缀:'urn:晶体的报告:schemas'。所以你的* Output.xml *是空白的。我已经调整了XSLT来解决这个问题。顺便说一句,您可以直接从URL加载您的XML。使用您发布的链接查看更新的VBA。 – Parfait

+0

这是工作! 我试过XSLT,但是我有这个错误,现在我不这么做:)。 大感谢帮助! – kumcio