2017-04-21 79 views
0

我想将XML文件导入到MS-Access中,并且我已经广泛搜索了一些类似于我的东西的例子,但是我已经简要地介绍过了。导入没有XSLT文件的结果是我只获取第一行值。例如,我得到2个表格:ABC和DEF,并且两个表格中只有第一个值(分别为'1234567891011'和'12116360102')。理想情况下,我想要的是带有所有相应值的2个字段(ABC和DEF)的表格。我可以用创建2个独立的表格来生活,但这并不理想,因为我有多个XML文件,并且在每个XML文件的一个表中管理它们会更容易。这是一个XML示例。任何帮助将非常感激。 :将XML文件导入带有转换文件的MS Access

<Codes> 
    <ABC> 
    <Value>1234567891011</Value> 
    <Value>1234567891110</Value> 
    <Value>1234567891022</Value> 
    </ABC> 
    <DEF> 
    <Value>12116360102</Value> 
    <Value>65416360402</Value> 
    <Value>68559760202</Value> 
    </DEF> 
</Codes> 
+0

没有XSLT文件我希望将不得不使用VBA来打开该文件为文本文件对象,并读取每一行和写入数据表。 – June7

回答

0

事实上,考虑XSLT,声明,特殊目的而设计的,从各种结构转换XML文件到最终使用的格式,包括其它XML,HTML,甚至TXT/CSV,语言(同类型SQL)文件。

具体来说,您需要在根的孩子(ABCDEF等)迁移到新的节点像来源在文档的每个价值节点。将XSLT中的<mytable>更改为您希望在MS Access中使用的表的名称,并将<Source>更改为您希望在该新表中使用的字段名称。

XSLT脚本(另存为的.xsl文件中VBA来加载)

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

    <xsl:template match="/Codes"> 
    <xsl:copy> 
     <xsl:apply-templates select="*"/> 
    </xsl:copy> 
    </xsl:template> 

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

    <xsl:template match="*[name()='Value']"> 
    <mytable> 
     <Source><xsl:value-of select="name(parent::*)"/></Source> 
     <xsl:copy-of select="."/> 
    </mytable> 
    </xsl:template> 

</xsl:transform> 

VBA(请注意,转换的输出文件的访问被进口)

Public Sub TransformAndImportXML() 
    ' INCLUDE Microsoft XML, v3.0 REFERENCE 
    Dim xmlDoc As New MSXML2.DOMDocument, xslDoc As New MSXML2.DOMDocument, newDoc As New MSXML2.DOMDocument 
    xmlDoc.Load "C:\Path\To\XML\Input.xml" 
    xslDoc.Load "C:\Path\To\XML\File.xsl" 

    xmlDoc.transformNodeToObject xslDoc, newDoc 
    newDoc.Save "C:\Path\To\XML\Output.xml" 

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

    Application.ImportXML "C:\Path\To\XML\Output.xml" 
    MsgBox "Successfully transformed and imported XML!", vbInformation 
End Sub 

XML输出

<?xml version="1.0" encoding="utf-8"?> 
<Codes> 
    <mytable> 
    <Source>ABC</Source> 
    <Value>1234567891011</Value> 
    </mytable> 
    <mytable> 
    <Source>ABC</Source> 
    <Value>1234567891110</Value> 
    </mytable> 
    <mytable> 
    <Source>ABC</Source> 
    <Value>1234567891022</Value> 
    </mytable> 
    <mytable> 
    <Source>DEF</Source> 
    <Value>12116360102</Value> 
    </mytable> 
    <mytable> 
    <Source>DEF</Source> 
    <Value>65416360402</Value> 
    </mytable> 
    <mytable> 
    <Source>DEF</Source> 
    <Value>68559760202</Value> 
    </mytable> 
</Codes> 

的MS Access进口(mytable的内容)

Source   Value 
    ABC 1234567891011 
    ABC 1234567891110 
    ABC 1234567891022 
    DEF 12116360102 
    DEF 65416360402 
    DEF 68559760202 
+0

谢谢!这工作!我的目标是为我们团队中的一些非技术人员创建一个简单的解决方案,并且我担心一个涉及让他们运行VBA的解决方案,但仅仅使用XSLT来转换导入对他们来说很好。 – Culpower

+0

很高兴听到。很高兴我能帮上忙。请接受解决方案(勾选标记到旁边)以确认解决方案! – Parfait

相关问题