使用 python ElementTree 从 xml 获取名称空间

Yul*_*uli 8 xml dictionary elementtree python-2.7

我使用 python 2.7 和 ElementTree 库。

我无法使用 lxml lib。

我需要获取字符串中的名称空间namespace_string。为了填充我的命名空间字典。

我的XML:

<?xml version="1.0" encoding="UTF-8"?>
<AX_Bestandsdatenauszug
    xmlns="http://www.adv-online.de/namespaces/adv/gid/6.0"
    xmlns:adv="http://www.adv-online.de/namespaces/adv/gid/6.0"
    xmlns:gco="http://www.isotc211.org/2005/gco"
    xmlns:gmd="http://www.isotc211.org/2005/gmd"
    xmlns:gml="http://www.opengis.net/gml/3.2"
    xmlns:ows="http://www.opengis.net/ows"
    xmlns:wfs="http://www.adv-online.de/namespaces/adv/gid/wfs"
    xmlns:wfsext="http://www.adv-online.de/namespaces/adv/gid/wfsext"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ogc="http://www.adv-online.de/namespaces/adv/gid/ogc"
    xsi:schemaLocation="http://www.adv-online.de/namespaces/adv/gid/6.0 NAS-Operationen.xsd">

    <enthaelt>
            <gml:featureMember>
            <xmlstuff>....a lot of xml stuff....</xmlstuff>
            </gml:featureMember>
    </enthaelt>
</AX_Bestandsdatenauszug>
Run Code Online (Sandbox Code Playgroud)

代码:

import clr
import sys

clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
sys.path.append("C:\Program Files (x86)\IronPython 2.7\Lib")
import xml.etree.ElementTree as ET
from io import StringIO


xml="file.xml"

tree = ET.parse(xml)
root = tree.getroot()


my_schema = "namespace_string"

my_namespaces = dict([node for _, node in ET.iterparse(StringIO(my_schema), events=['start-ns'])])
Run Code Online (Sandbox Code Playgroud)

字典的代码来自这个答案:https ://stackoverflow.com/a/37409050/7317684

我尝试过namespace_string=root.tag,但这只让我 ="{ http://www.adv-online.de/namespaces/adv/gid/6.0 }AX_Bestandsdatenauszug"

只找到lxml解决方案:(

任何帮助都会很棒!

mzj*_*zjn 11

创建具有所有声明的名称空间的字典的代码可以变得非常简单。这就是所需要的:

import xml.etree.ElementTree as ET

my_namespaces = dict([node for _, node in ET.iterparse('file.xml',
                                                        events=['start-ns'])])
Run Code Online (Sandbox Code Playgroud)

您不需要使用StringIOopen()。只需提供 XML 文件名作为iterparse().

提供的每个项目iterparse()都是一个(event, (prefix, namespace-uri))元组。iterparse 的 Python 2.7 文档start-ns中没有描述该事件(但在相应的Python 3 文档中提到了)。


注意:上面的代码适用于 CPython 和 Jython,但不适用于 IronPython。请参阅 https://github.com/IronLanguages/main/issues/968


sau*_*797 3

您应该传递 xml 文件的内容而ET.iterparse()不是字符串 my_schema。

将您的代码更改为:

from io import StringIO
import xml.etree.ElementTree as ET

xml = "file.xml"
f = open(xml, "r")
xml_data = unicode(f.read() , "utf-8") 
my_namespaces = dict([node for _, node in ET.iterparse(StringIO(xml_data), events=['start-ns'])])

from pprint import pprint
pprint(my_namespaces)
Run Code Online (Sandbox Code Playgroud)

输出:

{'': 'http://www.adv-online.de/namespaces/adv/gid/6.0',
 u'adv': 'http://www.adv-online.de/namespaces/adv/gid/6.0',
 u'gco': 'http://www.isotc211.org/2005/gco',
 u'gmd': 'http://www.isotc211.org/2005/gmd',
 u'gml': 'http://www.opengis.net/gml/3.2',
 u'ogc': 'http://www.adv-online.de/namespaces/adv/gid/ogc',
 u'ows': 'http://www.opengis.net/ows',
 u'wfs': 'http://www.adv-online.de/namespaces/adv/gid/wfs',
 u'wfsext': 'http://www.adv-online.de/namespaces/adv/gid/wfsext',
 u'xlink': 'http://www.w3.org/1999/xlink',
 u'xsd': 'http://www.w3.org/2001/XMLSchema',
 u'xsi': 'http://www.w3.org/2001/XMLSchema-instance'}
Run Code Online (Sandbox Code Playgroud)