2015-05-04 55 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

相關問題