2017-02-18 12 views
0

Я использую python 2.7 с lib ElementTree.получить пространства имен из xml с помощью python 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> 

код:

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'])]) 

Код для словаря из этого ответа: https://stackoverflow.com/a/37409050/7317684

I судимое namespace_string=root.tag но поймите меня только = "{http://www.adv-online.de/namespaces/adv/gid/6.0} AX_Bestandsdatenau szug»

Найдено только LXML решения :(

Любая помощь будет здорово!

ответ

0

Вы должны передать содержимое файла 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) 

Выход:

{'': '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'} 
+0

Thx для вашей помощи, но я получил значение «ValueError: write to closed file» в этой строке: 'my_namespaces = dict ([узел для _, узел в ET.iterparse (StringIO (xml_data), events = ['start -ns'])]) '. – Yuli

+0

Теперь вы можете проверить отредактированный код, строка 'my_namespaces = dict ([узел для _, узел в ET.iterparse (StringIO (xml_data), events = ['start-ns'])])' должен находиться внутри с блок. – saurabhsuman4797

+0

Такая же ошибка в той же строке появляется с кодонной в блоке. – Yuli

0

код для создания словаря со всеми заявленными пространствами имен можно сделать довольно просто. Это все, что необходимо:

import xml.etree.ElementTree as ET 

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

Вам не нужно использовать StringIO или open(). Просто укажите имя файла XML в качестве аргумента iterparse().

Каждый товар предоставлен iterparse() является кортежем (event, (prefix, namespace-uri)). Событие start-ns не описано в Python 2.7 documentation of iterparse (но оно указано в соответствующем Python 3 documentation).


Примечание: код выше работает в CPython и Jython, но не в IronPython. См. https://github.com/IronLanguages/main/issues/968.

+0

Я забыл упомянуть, что я использую IronPython 2.7. Я не знал, что это важно. У меня есть ошибка, которая говорит: IronPython не поддерживает 'iterparse'. Но, как ни странно, это было не так с кодом ** saurabhsuman ** ошибка не возникала. – Yuli

+0

Неразрешенный отчет об ошибке: https://github.com/IronLanguages/main/issues/968. См. Также http://vincenzo-ampolo.net/2012/06/18/why-ironpython-is-shit/. – mzjn