【问题标题】:Importing an XML file into MS Access with transform file使用转换文件将 XML 文件导入 MS Access
【发布时间】:2017-09-19 00:51:51
【问题描述】:

我正在尝试将一个 XML 文件导入 MS-Access,并且我已经广泛搜索了一个与我的类似的示例,但我没有找到。在没有 XSLT 文件的情况下导入的结果是我只得到了第一行值。例如,我得到 2 个表:ABC 和 DEF,两个表中只有第一个值(分别为“1234567891011”和“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>

【问题讨论】:

  • 如果没有 XSLT 文件,我预计将不得不使用 VBA 将文件作为文本文件对象打开并读取每一行并将数据写入表。

标签: xml ms-access import


【解决方案1】:

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

具体来说,您需要为每个 Value 节点。将 XSLT 中的 &lt;mytable&gt; 更改为 MS Access 中所需的表名称,并将 &lt;Source&gt; 更改为该新表中所需的字段名称。

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 (注意转换的输出文件是在Access中导入的)

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

【讨论】:

  • 谢谢!那行得通!我的目标是为我们团队中的一些非技术人员创建一个简单的解决方案,我担心涉及让他们运行 VBA 的解决方案,但简单地使用 XSLT 转换导入对他们来说效果很好。
  • 很高兴听到。很高兴我能帮助你。请接受解决方案(在旁边打勾)以确认解决方案!
  • 谢谢芭菲!您如何将这种方法应用于更复杂的遍历封闭文件夹结构的任务,该结构包含多个类似这样的 XML 文件 (stackoverflow.com/questions/52019902/…)?
猜你喜欢
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多