我正在尝试将一个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>
答案 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}}