【问题标题】:Omit foreign key values from child elements when exporting from Access to XML从 Access 导出到 XML 时忽略子元素的外键值
【发布时间】:2015-12-31 01:09:46
【问题描述】:

我有两个表 CR 和 RELEASE,关系从 CR (ID) 到 RELEASE (CRID) 一对多。

CR(设计):

ID: key, unique
Description: text

发布(设计):

ID: key, unique
CRID: number, not unique
Name: text

使用以下 VBA 代码,我成功地将表导出为 XML。

Set objOrderInfo = Application.CreateAdditionalData
objOrderInfo.Add ("RELEASE")
Application.ExportXML ObjectType:=acExportTable, DataSource:="CR", _
                      DataTarget:=pFileNAme, _
                      AdditionalData:=objOrderInfo

导出的 XML 类似于:

<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2015-12-09T09:34:28">
<CR>
    **<ID>1</ID>**
    <Description>Test</Description>
    <RELEASE>
        <ID>1</ID>
        **<CRID>1</CRID>**
        <Name>R2016</Name>
    </RELEASE>
    <RELEASE>
        <ID>2</ID>
        **<CRID>1</CRID>**
        <Name>R2017</Name>
    </RELEASE>
</CR>

请注意,CRID 在 XML 中显示了多次,这实际上是多余的。如何从 XML 中的 RELEASE 元素中删除 CRID 元素?谢谢,

【问题讨论】:

  • 您可以创建一个仅包含您需要的字段的查询,然后导出该查询。简单得多。
  • @iDevlop - 这将创建一个“扁平”的非规范化 XML 文件,这不是用户想要的。

标签: xml ms-access vba ms-access-2010


【解决方案1】:

如果您在使用 Application.ExportXML 后需要调整 XML 输出,您可以将初始导出到临时 XML 文件,然后使用 .xslt 文件,如下所示:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="RELEASE/CRID">
        <!-- omit by doing nothing -->
    </xsl:template>

</xsl:stylesheet>

和这样的 VBA 例程

Option Compare Database
Option Explicit

Public Sub ApplyXmlTransform(sourceFile, stylesheetFile, resultFile)
    ' ref: http://archive.oreilly.com/pub/post/transforming_xml_in_microsoft.html
    '
    ' project reference required: Microsoft XML, v4.0

    Dim source As New MSXML2.DOMDocument30
    Dim stylesheet As New MSXML2.DOMDocument30
    Dim result As New MSXML2.DOMDocument30

    ' Load data.
    source.async = False
    source.Load sourceFile  ' source .xml file

    ' Load style sheet.
    stylesheet.async = False
    stylesheet.Load stylesheetFile  ' .xslt file

    If (source.parseError.errorCode <> 0) Then
        MsgBox ("Error loading source document: " & source.parseError.reason)
    Else
        If (stylesheet.parseError.errorCode <> 0) Then
            MsgBox ("Error loading stylesheet document: " & stylesheet.parseError.reason)
        Else
            ' Do the transform.
            source.transformNodeToObject stylesheet, result
            result.Save resultFile  ' resulting .xml file
        End If
    End If

End Sub

&lt;RELEASE&gt; 元素中删除&lt;CRID&gt;

【讨论】:

  • 我使用 XSLT 生成最终结果。非常感谢!
【解决方案2】:

我看不出你怎么能。毕竟CRID是表RELEASE的一个字段:

<RELEASE>
    <ID>1</ID>
    <CRID>1</CRID>
    <Name>R2016</Name>
</RELEASE>

【讨论】:

  • 这就是两难境地,我想保留它以创建关系,但想摆脱它,因为它是重复的信息...是否可以在 xml 之后过滤 VBA 中的信息创建?
  • 好吧,你我都能看到,但 XML 文件(原样)只知道 about 关系,而不知道 how(哪个字段)。除了 HTML 样式的标记之外,这还会导致 XML 文件膨胀。但我猜你必须为另一个不受你控制的进程提供 XML 文件。如果没有,您可以使用其他格式,例如 Json 甚至 CSV。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多