如何将带有嵌套节点(父/子关系)的 XML 导入 Access?

Posted

技术标签:

【中文标题】如何将带有嵌套节点(父/子关系)的 XML 导入 Access?【英文标题】:How to import XML with nested nodes (parent/child relationships) into Access? 【发布时间】:2015-05-04 11:43:48 【问题描述】:

我正在尝试将 XML 文件导入 Access,但它会创建 3 个不相关的表。即子记录导入到子表中,但无法知道哪些子记录属于哪个父表。

如何导入数据来维护父子节点(记录)之间的关系?

这是 XML 数据的示例:

<NOTARIO>
    <C_NOT>8404180</C_NOT>
    <APE>Abalos Nuevo</APE>
    <NOM>Francisco José</NOM>
    <NOTARIAS>
        <NOTARIA>
            <PRO>23</PRO>
            <MUN>0888</MUN>
            <F_IN>1984-12-01</F_IN>
            <F_FI>1986-09-19</F_FI>
        </NOTARIA>
        <NOTARIA>
            <PRO>14</PRO>
            <MUN>0569</MUN>
            <F_IN>1990-09-17</F_IN>
            <F_FI>1995-03-15</F_FI>
        </NOTARIA>
        <NOTARIA>
            <PRO>21</PRO>
            <MUN>0412</MUN>
            <F_IN>1995-03-30</F_IN>
            <F_FI></F_FI>
        </NOTARIA>
    </NOTARIAS>
</NOTARIO>

【问题讨论】:

【参考方案1】:

您需要做的是将您的 XML 数据转换为一种更适合 Access 的格式。具体来说,需要在每个子节点中插入父键值(假设本例为C_NOT)。

以下 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="/">
        <dataroot>
            <xsl:apply-templates select="@*|node()"/>
        </dataroot>
    </xsl:template>

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

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

    <xsl:template match="NOTARIA">
        <NOTARIA>
            <C_NOT><xsl:value-of select="../../C_NOT"/></C_NOT>
            <xsl:apply-templates select="@*|node()"/>
        </NOTARIA>
    </xsl:template>

</xsl:stylesheet>

这将使您的 XML 从此...

<NOTARIO>
    <C_NOT>8404180</C_NOT>
    <APE>Abalos Nuevo</APE>
    <NOM>Francisco José</NOM>
    <NOTARIAS>
        <NOTARIA>
            <PRO>23</PRO>
            <MUN>0888</MUN>
            <F_IN>1984-12-01</F_IN>
            <F_FI>1986-09-19</F_FI>
        </NOTARIA>
        <NOTARIA>
            <PRO>14</PRO>
            <MUN>0569</MUN>
            <F_IN>1990-09-17</F_IN>
            <F_FI>1995-03-15</F_FI>
        </NOTARIA>
        <NOTARIA>
            <PRO>21</PRO>
            <MUN>0412</MUN>
            <F_IN>1995-03-30</F_IN>
            <F_FI></F_FI>
        </NOTARIA>
    </NOTARIAS>
</NOTARIO>

...进入这个:

<?xml version="1.0" encoding="UTF-8"?>
<dataroot>
    <NOTARIO>
        <C_NOT>8404180</C_NOT>
        <APE>Abalos Nuevo</APE>
        <NOM>Francisco José</NOM>
        <NOTARIA>
            <C_NOT>8404180</C_NOT>
            <PRO>23</PRO>
            <MUN>0888</MUN>
            <F_IN>1984-12-01</F_IN>
            <F_FI>1986-09-19</F_FI>
        </NOTARIA>
        <NOTARIA>
            <C_NOT>8404180</C_NOT>
            <PRO>14</PRO>
            <MUN>0569</MUN>
            <F_IN>1990-09-17</F_IN>
            <F_FI>1995-03-15</F_FI>
        </NOTARIA>
        <NOTARIA>
            <C_NOT>8404180</C_NOT>
            <PRO>21</PRO>
            <MUN>0412</MUN>
            <F_IN>1995-03-30</F_IN>
            <F_FI />
        </NOTARIA>
    </NOTARIO>
</dataroot>

...在 Access 导入时在后台。

将该 XSLT 文件保存到您的硬盘驱动器(我将我的文件称为“transformio.xslt”),然后启动 Access XML 导入过程。选择要导入的 XML 文件后,单击“转换”按钮 ...

...将您新创建的 XSLT 文件添加到列表中并选择它...

当您单击“确定”并返回到“导入 XML”对话框时,您可以展开树视图以查看您现在在两个表中都有 C_NOT 值。

导入完成后,您仍然有两个表,但现在您可以在C_NOT 上将它们加入以获取数据的“平面”视图:

这给了我们

【讨论】:

以上是关于如何将带有嵌套节点(父/子关系)的 XML 导入 Access?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用xsl根据属性将xml的兄弟节点更改为父节点和子节点

在核心数据中保存动态生成的带有父->子关系的JSON数据?

jquery嵌套网页获取最外层父页面

从访问中导出嵌套的 XML 文件。需要带有节点的XML文件[重复]

PHP遍历函数将单个数组转换为带有子元素的嵌套数组 - 基于父ID

XSLT - 如何将节点内的内联/转义 XML 视为嵌套节点