2015-05-04 25 views
4

我想将一个XML文件导入到Access中,但它创建了3个不相关的表。也就是说,子记录被导入到子表中,但无法知道哪个子记录属于哪个父项。如何将带有嵌套节点(父/子关系)的XML导入到Access中?

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

这里是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> 

回答

10

你需要做的是变换您的XML数据转换成与接入工作更好的格式是什么。具体来说,您需要在每个子节点中插入父键值(假设在这种情况下为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文件导入,点击“转换”按钮...

ImportXmlDialog.png

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

ImportTransforms.png

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

ImportXml2.png

当导入完成后,仍然有两个表,但现在你可以加入他们C_NOT得到数据的“扁平化”的观点:

QueryDesign.png

这给我们提供

QuerySheet.png

相关问题