嵌套XML到已联接的MySQL表

嵌套XML到已联接的MySQL表,mysql,sql,xml,nested,Mysql,Sql,Xml,Nested,我有一些带有嵌套字段的数据要导入MySQL。可能会有很多文件,因此任何可重复的脚本语言都值得赞赏。看起来这应该比我做的容易,但我找不到一个好的答案 我相信最干净的方法是使用联接表,尽管在父表中也有一个元素会很好,比如说如果它在下面的示例中有种类代码“A1” 这里回答了一个类似的查询,只是它不是MySQL,数据带有唯一标识符。我的数据面临的一个挑战是,数据中没有唯一的标识符来创建连接表的主键 下面是示例数据。在这里,doc id和assignor标记必须是单独的表并连接在一起。数据中有一个DTD,

我有一些带有嵌套字段的数据要导入MySQL。可能会有很多文件,因此任何可重复的脚本语言都值得赞赏。看起来这应该比我做的容易,但我找不到一个好的答案

我相信最干净的方法是使用联接表,尽管在父表中也有一个元素会很好,比如说如果它在下面的示例中有种类代码“A1”

这里回答了一个类似的查询,只是它不是MySQL,数据带有唯一标识符。我的数据面临的一个挑战是,数据中没有唯一的标识符来创建连接表的主键

下面是示例数据。在这里,doc id和assignor标记必须是单独的表并连接在一起。数据中有一个DTD,我没有考虑它的价值。非常感谢您的任何意见

 <?xml version="1.0" encoding="UTF-8"?>
<assignment>
    <assignment-record>
        <reel-no>28879</reel-no>
        <frame-no>97</frame-no>
        <last-update-date><date>20120903</date></last-update-date>
        <recorded-date><date>20120830</date></recorded-date>
        <page-count>4</page-count>
        <correspondent>
            <name>LEE, HONG, DEGERMAN, KANG &amp; WAIMEY</name>
            <address-1>660 S. FIGUEROA ST., 23RD FL.</address-1>
            <address-2>LOS ANGELES, CA 90017</address-2>
        </correspondent>
        <conveyance-text>ASSIGNMENT OF ASSIGNORS INTEREST (SEE DOCUMENT FOR DETAILS).</conveyance-text>
    </assignment-record>
    <assignors>
        <assignor>
            <name>WOO, SUNGHO</name>
            <execution-date><date>20120806</date></execution-date>
        </assignor>
            <assignor>
                <name>CHOI, JAEYOUNG</name>
                <execution-date><date>20120806</date></execution-date>
        </assignor>
    </assignors>
    <docproperties>
        <property>
            <document-id>
                <country>US</country>
                <doc-number>13277056</doc-number>
                <kind>X0</kind>
                <date>20111019</date>
            </document-id>
            <document-id>
                <country>US</country>
                <doc-number>20120213136</doc-number>
                <kind>A1</kind>
                <date>20120823</date>
            </document-id>
            <title lang="en">SYSTEMS AND METHODS FOR CONTROLLING SENSOR DEVICES IN MOBILE DEVICES</title>
     </property>
    </docproperties>
</assignment>
</xml>

28879
97
20120903
20120830
4.
李,洪,德格曼,康和,;韦米
佛罗里达州23号菲格罗亚大街南660号。
加利福尼亚州洛杉矶90017
转让人权益的转让(详情见文件)。
呜,成浩
20120806
崔,JAEYOUNG
20120806
美国
13277056
X0
20111019
美国
20120213136
A1
20120823
用于控制移动设备中的传感器设备的系统和方法

由于这个三年前未回答的问题最近被另一位用户提出,我代表社区回答了这个问题,因为原来的OP已不再活跃

对于未来的读者,无论何时你需要平移嵌套的XML文件以用于FLASH文件导入,如数据库表考虑,用于操作XML文件的转换语言。实际上,所有通用语言都有一些用于XSLT1.0处理的库,包括Python、PHP、Perl、Java、C#、VB等

正如OP提到的Python,下面的示例使用第三方模块来展平XML文件。为了生成一个唯一的id来关联
数据,XSLT脚本中的XPath使用
祖先
运行,以从
检索两个节点作为同级节点共享的卷号值。这类似于发布链接中的TSQL解决方案

XSLT脚本(另存为.xsl,在Python中引用)

转让人转换

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>

  <xsl:template match="/assignment">
    <xsl:copy>      
      <xsl:apply-templates select="descendant::assignor"/>
    </xsl:copy>
  </xsl:template>  

  <xsl:template match="assignor">
    <xsl:copy>
      <assign_id>
          <xsl:value-of select="ancestor::assignment/assignment-record/reel-no"/>
      </assign_id>
      <xsl:copy-of select="name"/>
      <xsl:copy-of select="execution-date/date"/>        
    </xsl:copy>
  </xsl:template>

</xsl:transform>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>

  <xsl:template match="/assignment">
    <xsl:copy>
      <xsl:apply-templates select="descendant::document-id"/>
    </xsl:copy>
  </xsl:template>  

  <xsl:template match="document-id">
    <xsl:copy>
      <assign_id>
          <xsl:value-of select="ancestor::assignment/assignment-record/reel-no"/>
      </assign_id>
      <xsl:copy-of select="*"/>        
    </xsl:copy>
  </xsl:template>

</xsl:transform>
XML输出(现在可以有效地使用MySQL的LOAD-XML)


28879
呜,成浩
20120806
28879
崔,JAEYOUNG
20120806
28879
美国
13277056
X0
20111019
28879
美国
20120213136
A1
20120823

您调查过了吗?是的,谢谢。这看起来达到了90%,除了我在父项中没有一个唯一的ID字段,我可以自动放入子项中(那太好了)。我可能会选择一些在组合中可能是独特的领域,但我不能保证,我不认为。而且,我有几个字段,其中日期隐藏在一个双字段中-20120806,我不知道LOAD XML会处理这个问题-尽管我还没有测试这个特定方面。确认XML加载不能与嵌套的日期标记一起工作,因为它只查找最上面的日期。最后,我从头开始写了一个python脚本。谢谢你——这看起来很棒。我通过解析xml以一种类似的方式解决了这个问题,尽管远没有那么优雅。这并不是说我不再活跃了——我刚开始的时候:)哇!我是一个信徒。有这么多的用户问1-2个问题,然后就永远消失了。很高兴知道你还在登记入住!请问更多的技术问题。快乐编码!
<?xml version="1.0" encoding="UTF-8"?>
<assignment>
  <assignor>
    <assign_id>28879</assign_id>
    <name>WOO, SUNGHO</name>
    <date>20120806</date>
  </assignor>
  <assignor>
    <assign_id>28879</assign_id>
    <name>CHOI, JAEYOUNG</name>
    <date>20120806</date>
  </assignor>
</assignment>


<?xml version="1.0" encoding="UTF-8"?>
<assignment>
  <document-id>
    <assign_id>28879</assign_id>
    <country>US</country>
    <doc-number>13277056</doc-number>
    <kind>X0</kind>
    <date>20111019</date>
  </document-id>
  <document-id>
    <assign_id>28879</assign_id>
    <country>US</country>
    <doc-number>20120213136</doc-number>
    <kind>A1</kind>
    <date>20120823</date>
  </document-id>
</assignment>