如何将带有嵌套节点(父/子关系)的 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的兄弟节点更改为父节点和子节点
从访问中导出嵌套的 XML 文件。需要带有节点的XML文件[重复]