【问题标题】:How to import XML with nested nodes (parent/child relationships) into Access?如何将带有嵌套节点(父/子关系)的 XML 导入 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>

【问题讨论】:

    标签: xml ms-access import


    【解决方案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 上将它们加入以获取数据的“平面”视图:

    这给了我们

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-18
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多