gpt4 book ai didi

python - 使用 python 生成完整的 XML 文件

转载 作者:行者123 更新时间:2023-12-01 02:27:46 24 4
gpt4 key购买 nike

我需要用 Python 机器生成(而不是解析!)一个(可能很复杂)XML 文件。

我(相对)熟悉 xml 和 lxml 模块,但我不清楚如何根据 xsl 规范生成有效的 XML 检查

我需要构建的是这样的:

<?xml version='1.0' encoding='utf-8'?>
<package xmlns="http://www.idpf.org/2007/opf" unique-identifier="uuid_id" version="2.0">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
<dc:identifier opf:scheme="calibre" id="calibre_id">4117</dc:identifier>
<dc:identifier opf:scheme="uuid" id="uuid_id">d06a2234-67b4-40db-8f4a-136e52057101</dc:identifier>
<dc:title>La Fine Di Alice</dc:title>
<dc:creator opf:file-as="Homes, A. M." opf:role="aut">A. M. Homes</dc:creator>
<dc:contributor opf:file-as="calibre" opf:role="bkp">calibre (3.10.0) [https://calibre-ebook.com]</dc:contributor>
<dc:date>2005-11-15T00:00:00+00:00</dc:date>
<dc:publisher>Minimum Fax</dc:publisher>
<dc:identifier opf:scheme="ISBN">9788875210649</dc:identifier>
<dc:language>en</dc:language>
<meta content="{&quot;A. M. Homes&quot;: &quot;&quot;}" name="calibre:author_link_map"/>
<meta content="2017-11-07T07:34:41.217796+00:00" name="calibre:timestamp"/>
<meta content="La Fine Di Alice" name="calibre:title_sort"/>
</metadata>
<guide>
<reference href="cover.jpg" title="Cover" type="cover"/>
</guide>
</package>

完整语法为here .

我尝试了一些类似的东西:

from lxml import etree as ET

et = ET.Element('package', attrib={'version': "2.0", 'xmlns': "http://www.idpf.org/2007/opf", 'unique-identifier': "BookId"})
md = ET.SubElement(et, 'metadata', attrib={'xmlns:dc': "http://purl.org/dc/elements/1.1/", 'xmlns:opf': "http://www.idpf.org/2007/opf"})
au = ET.SubElement(md, 'dc:title')
au.text = bk['Title']

s = ET.tostring(et, pretty_print=True)

...但它惨遭失败:“ValueError: 无效的属性名称 'xmlns:dc'”

欢迎任何指点。

最佳答案

引用:http://lxml.de/tutorial.html#namespaces

您不得将命名空间指定为 : 限定字符串。相反,您可以使用 {http://url.url/url}tag 形式或 QName 形式。

这是您的程序,使用命名空间:

from lxml import etree as ET

NS_DC = "http://purl.org/dc/elements/1.1/"
NS_OPF = "http://www.idpf.org/2007/opf"
nsmap = {
"dc": NS_DC,
None: NS_OPF,
}
PACKAGE = ET.QName(NS_OPF, 'package')
METADATA = ET.QName(NS_OPF, 'metadata')
TITLE = ET.QName(NS_DC, 'title')

et = ET.Element(PACKAGE,
attrib={'version': "2.0",
'unique-identifier': "BookId"},
nsmap=nsmap)

md = ET.SubElement(et, METADATA)
au = ET.SubElement(md, TITLE)
au.text = "A Tale of Two Cities"

s = ET.tostring(et, pretty_print=True)
print(s.decode('utf-8'))
<小时/><小时/>

您可以选择使用lxml.builder.ElementMaker 。这是一个创建示例的一部分的程序。

注释:

  • 请注意使用 dict 来表示不是有效 Python 名称的属性名称。
  • 请注意使用 QName 来表示命名空间限定名称。
  • 请注意使用validator来验证生成的树。

 

from lxml import etree as ET
from lxml.builder import ElementMaker

NS_DC = "http://purl.org/dc/elements/1.1/"
NS_OPF = "http://www.idpf.org/2007/opf"
SCHEME = ET.QName(NS_OPF, 'scheme')
FILE_AS = ET.QName(NS_OPF, "file-as")
ROLE = ET.QName(NS_OPF, "role")
opf = ElementMaker(namespace=NS_OPF, nsmap={"opf": NS_OPF, "dc": NS_DC})
dc = ElementMaker(namespace=NS_DC)
validator = ET.RelaxNG(ET.parse("opf-schema.xml"))

tree = (
opf.package(
{"unique-identifier": "uuid_id", "version": "2.0"},
opf.metadata(
dc.identifier(
{SCHEME: "uuid", "id": "uuid_id"},
"d06a2234-67b4-40db-8f4a-136e52057101"),
dc.creator({FILE_AS: "Homes, A. M.", ROLE: "aut"}, "A. M. Homes"),
dc.title("My Book"),
dc.language("en"),
),
opf.manifest(
opf.item({"id": "foo", "href": "foo.pdf", "media-type": "foo"})
),
opf.spine(
{"toc": "uuid_id"},
opf.itemref({"idref": "uuid_id"}),
),
opf.guide(
opf.reference(
{"href": "cover.jpg", "title": "Cover", "type": "cover"})
),
)
)
validator.assertValid(tree)

print(ET.tostring(tree, pretty_print=True).decode('utf-8'))

关于python - 使用 python 生成完整的 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47184919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com