gpt4 book ai didi

python lxml 我如何在项目名称中使用标签?

转载 作者:太空宇宙 更新时间:2023-11-04 11:11:21 25 4
gpt4 key购买 nike

我需要使用项目的特殊名称构建 xml 文件,这是我当前的代码:

from lxml import etree
import lxml
from lxml.builder import E

wp = E.wp

tmp = wp("title")

print(etree.tostring(tmp))

当前输出是这样的:

b'<wp>title</wp>'

我想成为:

b'<wp:title>title</title:wp>'

我如何创建名称如下的项目:wp:title

最佳答案

你混淆了 namespace prefix wp与标签名称。 namespace 前缀是 namespace URI 的文档本地名称。 wp:title需要解析器寻找 xmlns:wp="..."属性来查找 namespace 本身(通常是一个 URL,但任何全局唯一的字符串都可以),在标签本身或父标签上。这会将标签连接到一个唯一值,而不会使标签名称过于冗长而无法输入或阅读。

您需要提供命名空间,并且可选地提供命名空间映射(将短名称映射到完整命名空间名称)到元素制造商对象。默认 E提供的对象没有命名空间或命名空间映射集。我将在这里假设 wphttp://wordpress.org/export/1.2/ Wordpress 命名空间,因为这似乎是最有可能的,尽管也可能是您正在尝试发送 Windows Phone notifications .

而不是使用默认的 E元素制造商,创造你自己的ElementMaker实例并传递给它 namespace论据告诉lxml元素属于哪个 URL。要在您的元素名称上获得正确的前缀,您还需要给它一个 nsmap将前缀映射到 URL 的字典:

from lxml.builder import ElementMaker

namespaces = {"wp": "http://wordpress.org/export/1.2/"}
E = ElementMaker(namespace=namespaces["wp"], nsmap=namespaces)

title = E.title("Value of the wp:title tag")

这会生成一个带有正确前缀 xmlns:wp 的标签属性:

>>> from lxml.builder import ElementMaker
>>> namespaces = {"wp": "http://wordpress.org/export/1.2/"}
>>> E = ElementMaker(namespace=namespaces["wp"], nsmap=namespaces)
>>> title = E.title("Value of the wp:title tag")
>>> etree.tostring(title, encoding="unicode")
'<wp:title xmlns:wp="http://wordpress.org/export/1.2/">Value of the wp:title tag</wp:title>'

您可以省略 nsmap值,但是您希望在文档的父级 元素上有这样一个映射。在这种情况下,您可能想要单独制作 ElementMaker您需要支持的每个 namespace 的对象,然后将 nsmap最外层元素上的命名空间映射。写文档时,lxml然后始终使用简称。

例如,创建一个 Wordpress WXR format document需要一些命名空间:

from lxml.builder import ElementMaker

namespaces = {
"excerpt": "https://wordpress.org/export/1.2/excerpt/",
"content": "http://purl.org/rss/1.0/modules/content/",
"wfw": "http://wellformedweb.org/CommentAPI/",
"dc": "http://purl.org/dc/elements/1.1/",
"wp": "https://wordpress.org/export/1.2/",
}

RootElement = ElementMaker(nsmap=namespaces)
ExcerptElement = ElementMaker(namespace=namespaces["excerpt"])
ContentElement = ElementMaker(namespace=namespaces["content"])
CommentElement = ElementMaker(namespace=namespaces["wfw"])
DublinCoreElement = ElementMaker(namespace=namespaces["dc"])
ExportElement = ElementMaker(namespace=namespaces["wp"])

然后你将构建一个文档

doc = RootElement.rss(
RootElement.channel(
ExportElement.wxr_version("1.2"),
# etc. ...
),
version="2.0"
)

当用 etree.tostring(doc, pretty_print=True, encoding="unicode") 漂亮地打印时, 产生:

<rss xmlns:excerpt="https://wordpress.org/export/1.2/excerpt/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wp="https://wordpress.org/export/1.2/" version="2.0">
<channel>
<wp:wxr_version>1.2</wp:wxr_version>
</channel>
</rss>

注意如何只有根<rss>元素有 xmlns属性,以及如何 <wp:wxr_version>标记使用正确的前缀,即使我们只给它命名空间 URI。

举一个不同的例子,如果你正在构建一个 Windows Phone 磁贴通知,它会更简单。毕竟,只有一个命名空间可供使用:

from lxml.builder import ElementMaker

namespaces = {"wp": "WPNotification"}
E = ElementMaker(namespace=namespaces["wp"], nsmap=namespaces)

notification = E.Notification(
E.Tile(
E.BackgroundImage("https://example.com/someimage.png"),
E.Count("42"),
E.Title("The notification title"),
# ...
)
)

产生

<wp:Notification xmlns:wp="WPNotification">
<wp:Tile>
<wp:BackgroundImage>https://example.com/someimage.png</wp:BackgroundImage>
<wp:Count>42</wp:Count>
<wp:Title>The notification title</wp:Title>
</wp:Tile>
</wp:Notification>

只有最外层的元素,<wp:Notification> , 现在有 xmlns:wp属性。所有其他元素只需要包含 wp:前缀。

请注意,使用的前缀完全由您决定,甚至可选。 namespace URI 是跨不同 XML 文档唯一标识元素的真正关键。如果您使用 E = ElementMaker(namespace="WPNotification", nsmap={None: "WPNotification"})相反,因此生成了一个带有 <Notification xmlns="WPNotification"> 的顶级元素您仍然拥有一个完全合法的 XML 文档,根据 XML 标准,该文档具有完全相同的含义。

关于python lxml 我如何在项目名称中使用标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58137296/

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