繁体   English   中英

在 python 中导入 XML 命名空间

[英]Import XML namespace in python

我在编码方面完全是个菜鸟,我学习 IT,并且有一个学校项目,我必须在其中将 .txt 文件转换为 XML 文件。 我已经设法创建了一个树和子元素,但必须在代码中放入一些 XML 命名空间。 因为最终必须在一个程序中打开 XML 文件,该程序为您提供信息表等等。 但是如果没有来自 XML 命名空间的方案,它就不会打开任何东西。 有人可以帮助我如何将 .xsd 放入我的代码中吗?

这是方案: http : //www.pufbih.ba/images/stories/epp_docs/PaketniUvozObrazaca_V1_0.xsd

必须创建的 XML 文件示例: http : //www.pufbih.ba/images/stories/epp_docs/4200575050089_1022.xml

在第一行有我必须输入的方案:“urn:PaketniUvozObrazaca_V1_0.xsd”

这是迄今为止创建的代码:

import xml.etree.ElementTree as xml

def GenerateXML(GIP1022):
root=xml.Element("PaketniUvozObrazaca")
p1=xml.Element("PodaciOPoslodavcu")
root.append(p1)

jib=xml.SubElement(p1,"JIBPoslodavca")
jib.text="4254160150005"
pos=xml.SubElement(p1,"NazivPoslodavca")
pos.text="MOJATVRTKA d.o.o. ORAŠJE"
zah=xml.SubElement(p1,"BrojZahtjeva")
zah.text="8"
datz=xml.SubElement(p1,"DatumPodnosenja")
datz.text="2021-01-01"

tree=xml.ElementTree(root)
with open(GIP1022,"wb") as files:
    tree.write(files)

if __name__=="__main__":
GenerateXML("primjer.xml")

官方文档并没有特别明确说明如何使用 ElementTree 中的命名空间,但其核心是 ElementTree 采用了一种非常基本的(ist)方法: elementtree 使用Clark 的 Notation ,而不是操作命名空间前缀/别名。

所以例如

<bar xmlns="foo">

要么

<x:bar xmlns:x="foo">

foo命名空间中的元素bar )将被写入

{foo}bar
>>> tostring(Element('{foo}bar'), encoding='unicode')
'<ns0:bar xmlns:ns0="foo" />'

或者(有时更方便创作和操作)您可以使用QName 对象,它可以采用克拉克符号标记名称,也可以分别采用命名空间和标记名称:

>>> tostring(Element(QName('foo', 'bar')), encoding='unicode')
'<ns0:bar xmlns:ns0="foo" />'

因此,虽然 ElementTree 本身没有命名空间对象,但您可以像这样创建命名空间对象,可能通过部分应用 QName 的帮助程序:

>>> root = Element(ns("PaketniUvozObrazaca"))
>>> SubElement(root, ns("PodaciOPoslodavcu"))
<Element <QName '{urn:PaketniUvozObrazaca_V1_0.xsd}PodaciOPoslodavcu'> at 0x7f502481bdb0>
>>> tostring(root, encoding='unicode')
'<ns0:PaketniUvozObrazaca xmlns:ns0="urn:PaketniUvozObrazaca_V1_0.xsd"><ns0:PodaciOPoslodavcu /></ns0:PaketniUvozObrazaca>'

现在这里有一些重要的考虑因素:

首先,当序列化是任意的时,您可以看到前缀,这符合 ElementTree 对 XML 的基本主义方法(前缀应该无关紧要),但它已经发展了一个“register_namespace”全局函数,允许注册特定的前缀:

>>> register_namespace('xxx', 'urn:PaketniUvozObrazaca_V1_0.xsd')
>>> tostring(root, encoding='unicode')
'<xxx:PaketniUvozObrazaca xmlns:xxx="urn:PaketniUvozObrazaca_V1_0.xsd"><xxx:PodaciOPoslodavcu /></xxx:PaketniUvozObrazaca>'

您还可以将单个default_namespace传递给(某些)序列化函数以指定默认命名空间:

>>> tostring(root, encoding='unicode', default_namespace='urn:PaketniUvozObrazaca_V1_0.xsd')
'<PaketniUvozObrazaca xmlns="urn:PaketniUvozObrazaca_V1_0.xsd"><PodaciOPoslodavcu /></PaketniUvozObrazaca>'

第二个可能更大的问题是ElementTree 不支持验证

Python 标准库不支持任何验证解析器或树构建器,无论是 DTD、rng、xml 模式还是任何东西。 不是默认的,也不是可选的。

lxml可能是支持验证(多种类型的模式)的主要替代方案,其核心 API 遵循 ElementTree 但以多种方式和方向扩展它(包括更精确的命名空间前缀支持和前缀往返)。 但即便如此,验证(AFAIK)大多是明确的,至少在生成/序列化文档时是这样。

tree.write()方法采用default_namespace参数。

如果将该行更改为以下内容会发生什么?

tree.write(files, default_namespace="urn:PaketniUvozObrazaca_V1_0.xsd")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM