您知道如何在 MySQL 中实现这一点吗?
是的,步行并使用CONCAT 字符串自己制作xml。试试
SELECT concat('<orders><employee emp_id="', emp_id, '"><customer cust_id="', cust_id, '" region="', region, '"/></employee></orders>') FROM table
我从 2009 年的回答 How to convert a MySQL DB to XML? 中得到这个,它似乎仍然有效。不是很方便,如果每个项目都有大树,它们都将在根项目的一个连接值中,但它有效,请参见这个带有假人的测试:
SELECT concat('<orders><employee emp_id="', 1, '"><customer cust_id="', 2, '" region="', 3, '"/></employee></orders>') FROM DUAL
给予
<orders><employee emp_id="1"><customer cust_id="2" region="3"/></employee></orders>
通过“手动编码”,你可以得到这个结构。
<?xml version="1.0"?>
<orders>
<employee emp_id="1">
<customer cust_id="2" region="3" />
</employee>
</orders>
我用每个根项目的更大树检查了这个,它工作了,但是我必须在它上面运行一个额外的 Python 代码来摆脱当你在 xml 路径中有中等级别节点时生成的太多的打开和关闭。可以将回溯列表与临时集合中的条目一起使用,我已经完成了,但是面向对象的方式会更专业。我刚刚编写了代码,以便在找到新的头项后立即从列表中删除最后的 x 项,以及嵌套分支的一些其他技巧。工作。
我想出了一个找到标签之间每个文本的正则表达式:
string = " <some tag><another tag>test string<another tag></some tag>"
pattern = r'(?:^\s*)?(?:(?:<[^\/]*?)>)?(.*?)?(?:(?:<\/[^>]*)>)?'
p = re.compile(pattern)
val = r''.join(p.findall(string))
val_escaped = escape(val)
if val_escaped != val:
string.replace(val, val_escaped)
此正则表达式可帮助您访问标签之间的文本。如果您被允许使用 CDATA,那么在任何地方使用它是最简单的。只需在 MySQL 中制作内容“CDATA”(字符数据)即可:
<Title><![CDATA[', t.title, ']]></Title>
除了非常奇怪的字符(如 (U+001A))之外,您将不会再遇到任何问题,您应该在 MySQL 中替换它们。然后,您根本不需要关心转义和替换其余的特殊字符。在 1 Mio 上为我工作。行 xml 文件,大量使用特殊字符。
然而:您应该使用 Python 的模块 xmlschema 对照所需的 xml 模式文件来验证文件。当您不允许使用该 CDATA 技巧时,它会提醒您。
如果您需要不带 CDATA 的完全 UTF-8 格式的内容(这通常是一项任务),您甚至可以通过针对 xml 逐步验证代码输出(= xml 输出)在 1 Mio 行文件中实现该目标架构文件(目标是 xsd)。这是一项繁琐的工作,但可以通过一些耐心来完成。
可以替换为:
- MySQL 使用 replace()
- Python 使用 string.replace()
- Python 使用 Regex 替换(虽然我最终不需要它,它会看起来像:
re.sub(re.escape(val), 'xyz', i))
- string.encode(encoding = 'UTF-8', errors = 'strict')
请注意,编码为 utf-8 是最强大的一步,它甚至可以抛开上述所有其他三种替换方式。还要注意:它使文本成为二进制,然后您需要将其视为二进制 b'...',因此您可以使用 wb 仅以二进制模式将其写入文件。
最后,您可以在普通浏览器(如 Firefox)中打开 XML 输出以进行最终检查并观察 XML 的工作情况。或者使用 xml 扩展在 vscode/codium 中检查它。但是不需要这些检查,在我的例子中,xmlschema 模块已经很好地显示了一切。还要注意,vscode/codium 可以很容易地处理 xml 问题,并且当 Firefox 不能时仍然显示树,因此,您需要一个验证器或浏览器来查看所有 xml 错误。
使用这个 xml-building-with-mysql 可以完成一个相当大的项目,最后有一个三重嵌套的 xml 树,父节点中有许多重复的标签,所有这些都是由二维 MySQL 输出制成的。