考虑使用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>
我试试这个,但是我有错误。 运行时错误“31593”: MS Access在处理OutputXML.xml文件中的XML模式时遇到错误 该文档必须只包含一个根元素 – kumcio
您实际上在根中有一个未声明的命名空间前缀:'urn:晶体的报告:schemas'。所以你的* Output.xml *是空白的。我已经调整了XSLT来解决这个问题。顺便说一句,您可以直接从URL加载您的XML。使用您发布的链接查看更新的VBA。 – Parfait
这是工作! 我试过XSLT,但是我有这个错误,现在我不这么做:)。 大感谢帮助! – kumcio