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