使用转换文件将XML文件导入MS Access

时间:2017-04-21 21:51:11

标签: xml ms-access import

我正在尝试将一个XML文件导入MS-Access,我已经广泛搜索了一个与我类似的例子,但我已经做得很短。没有XSLT文件导入的结果是我只得到第一行值。例如,我得到2个表:ABC和DEF,两个表中只有第一个值(分别为' 1234567891011'和#12; 12116360102')。理想情况下,我想要的是一个包含2个字段(ABC和DEF)的表,其中包含所有相应的值。我可以创建2个单独的表,但这并不理想,因为我有多个XML文件,并且在一个表中为每个XML文件管理它们会更容易。以下是XML的示例。任何帮助将非常感激。 :

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

1 个答案:

答案 0 :(得分:0)

确实,考虑XSLT,这是一种声明性的,专用的语言(与SQL类型相同),旨在将XML文件从各种结构转换为最终用途格式,包括其他XML,HTML甚至txt / csv文件。

具体来说,您需要将root的子项( ABC DEF 等)迁移到每个 Source 这样的新节点中<文档中的em> Value 节点。将XSLT中的<Source>更改为MS Access中所需的表的名称,并将<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> 更改为该新表中所需的字段名称。

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

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

VBA (请注意,转化的输出文件是在Access中导入的)

<?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>

XML 输出

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

MS Access 导入(mytable contents)

{{1}}