Найти - Пользователи
Полная версия: Парсинг пространсва имен в XML
Начало » Python для новичков » Парсинг пространсва имен в XML
1
al1
Есть XML файл, содержащий префиксы в тегах. Префиксы могут быть разными. Попытка в лоб сделать независимый от префикса кусок кода не увенчалась успехам. Данный код:
import xml.dom.minidom
dom = xml.dom.minidom.parse('C:\\1\\document.xml')
docinfo=dom.getElementsByTagName('xdms:document')
uidDoc = docinfo[0].getAttribute('xdms:uid')
mesginfo=dom.getElementsByTagName('xdms:header')
uidMesg=mesginfo[0].getAttribute('xdms:uid')
docinfoNS=dom.getElementsByTagNameNS('*','document')
uidDocNS = docinfoNS[0].getAttributeNS('','uid')
mesginfoNS=dom.getElementsByTagNameNS('*','header')
uidMesgNS=mesginfoNS[0].getAttributeNS('xdms','uid')
print(docinfo)
print(uidDoc)
print(mesginfo)
print(uidMesg)
print('-'*40)
print(docinfoNS)
print(uidDocNS)
print(mesginfoNS)
print(uidMesgNS)
Возвращает следующее:
[<DOM Element: xdms:document at 0x29e6440>]
F68B21E0-A8EA-4059-8585-29222DFCD744
[<DOM Element: xdms:header at 0x29e2f58>]
886B92F1-0D7D-48AE-84AF-D440A4ED9028
----------------------------------------
[<DOM Element: xdms:document at 0x29e6440>]

[<DOM Element: xdms:header at 0x29e2f58>]
подскажите в чем может быть косяк или иной способ работы с префиксами, да бы не зависить от них.
ilnur
не совсем понятно. покажи пример xml. и что хочешь получить
al1
ilnur
не совсем понятно. покажи пример xml. и что хочешь получить
хочу распарсить вот эту xml не зависимо каким будет префикс. необходимо вытаскивать значения атрибутов.
<?xml version="1.0" encoding="windows-1251"?>
<xdms:communication xdms:version="1.0" xmlns:xdms="......../IEDMS">
  <xdms:header xdms:type="Документ" xdms:uid="886B92F1-0D7D-48AE-84AF-D440A4ED9028" xdms:created="2014-02-20T10:35:07.8559394+04:00">
    </xdms:header>
  <xdms:document xdms:uid="F68B21E0-A8EA-4059-8585-29222DFCD744">  
</xdms:communication>
Соотвественно пытаюсь вытащить атрибуты uid из тегов header и document без учета префикса.
ilnur
а что в данном случае префикс?

посмотри эту тему. там парсится xml. все довольно просто. у тегов можно получить все атрибуты
http://python.su/forum/topic/23832/
al1
в данном случаи префикс xdms, а тегом будет xdms:header, атрибуты тега будут xdms:type, xdms:uid. так вот не хочется зависить от префикса, и работать напрямую с header и uid. в принципе научился работать с тегами без префиксов, но вот атрибуты не хочет проглатывать( в этом собственно и проблема…
al1
разобрался. можно закрывать или удалять…


ilnur
al1
разобрался. можно закрывать или удалять…
можешь показать как ты это сделал?
al1
XML:
<?xml version="1.0" encoding="windows-1251"?>
<xdms:communication xdms:version="1.0" xmlns:xdms="http://blablabla.com/IEDMS">
  <xdms:header xdms:type="Документ" xdms:uid="886B92F1-0D7D-48AE-84AF-D440A4ED9028" xdms:created="2014-02-20T10:35:07.8559394+04:00">
    </xdms:header>
  <xdms:document xdms:uid="F68B21E0-A8EA-4059-8585-29222DFCD744">  
</xdms:communication>

скрипт:
import xml.dom.minidom
dom = xml.dom.minidom.parse('C:\\1\\document.xml')
docinfoNS=dom.getElementsByTagNameNS('*','document')
uidDocNS = docinfoNS[0].getAttributeNS('http://blablabla.com/IEDMS','uid')
print(docinfoNS)
print(uidDocNS)

и получим желанные
[<DOM Element: xdms:document at 0x29e6440>]
F68B21E0-A8EA-4059-8585-29222DFCD744

важным моментов является правильно указать пространсво имен для getAttributeNS когда парсим по атрибутам, так называемый namespaceURI. пространство имен берется из самой XML:
<xdms:communication xdms:version="1.0" xmlns:xdms="http://blablabla.com/IEDMS">
тоесть в моем случаи это
http://blablabla.com/IEDMS
Он может быть совершенно любым, а не только распространненые, открытые и доступные всем схемы, как показано во всех примерах. к примеру мой нигде не опубликован, и по сути по этому адресу ничего нет. Когда парсим по тегам для getElementsByTagNameNS можно спокойно ставить * для параметра namespaceURI, тогда будет парсится независимо от префикса и схем.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB