在python中导入xml命名空间

zxlwwiss  于 2021-09-29  发布在  Java
关注(0)|答案(2)|浏览(413)

我是一个完全不懂编码的人,我学习它,并且有一个学校项目,在这个项目中我必须将.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
在第一行a有我必须输入的方案:“urn:paketniuvozobrazaca_v1_0.xsd”
这是迄今为止创建的代码a:

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")
thtygnil

thtygnil1#

关于如何使用elementtree中的名称空间,官方文档并不是非常明确,但其核心是elementtree采用了一种非常基本的(ist)方法:elementtree使用clark的表示法,而不是操纵名称空间前缀/别名。
例如。

<bar xmlns="foo">

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

(元素) barfoo 名称空间)将被写入

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

或者(有时更便于编写和操作)您可以使用qname对象,该对象可以采用clark符号标记名,也可以单独采用名称空间和标记名:

>>> 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)也大多是显式的,至少在生成/序列化文档时是如此。

rekjcdws

rekjcdws2#

这个 tree.write() 方法需要 default_namespace 论点
如果将该行更改为以下内容,会发生什么情况?

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

相关问题