Уведомления

Группа в Telegram: @pythonsu

#1 Март 31, 2014 10:28:00

al1
Зарегистрирован: 2014-03-31
Сообщения: 5
Репутация: +  1  -
Профиль   Отправить e-mail  

Парсинг пространсва имен в XML

Есть 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>]
подскажите в чем может быть косяк или иной способ работы с префиксами, да бы не зависить от них.

Офлайн

#2 Апрель 1, 2014 06:22:57

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

Парсинг пространсва имен в XML

не совсем понятно. покажи пример xml. и что хочешь получить

Офлайн

#3 Апрель 1, 2014 10:34:44

al1
Зарегистрирован: 2014-03-31
Сообщения: 5
Репутация: +  1  -
Профиль   Отправить e-mail  

Парсинг пространсва имен в XML

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 без учета префикса.

Офлайн

#4 Апрель 1, 2014 16:06:40

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

Парсинг пространсва имен в XML

а что в данном случае префикс?

посмотри эту тему. там парсится xml. все довольно просто. у тегов можно получить все атрибуты
http://python.su/forum/topic/23832/

Офлайн

#5 Апрель 1, 2014 16:19:47

al1
Зарегистрирован: 2014-03-31
Сообщения: 5
Репутация: +  1  -
Профиль   Отправить e-mail  

Парсинг пространсва имен в XML

в данном случаи префикс xdms, а тегом будет xdms:header, атрибуты тега будут xdms:type, xdms:uid. так вот не хочется зависить от префикса, и работать напрямую с header и uid. в принципе научился работать с тегами без префиксов, но вот атрибуты не хочет проглатывать( в этом собственно и проблема…

Офлайн

#6 Апрель 3, 2014 16:27:50

al1
Зарегистрирован: 2014-03-31
Сообщения: 5
Репутация: +  1  -
Профиль   Отправить e-mail  

Парсинг пространсва имен в XML

разобрался. можно закрывать или удалять…


Офлайн

#7 Апрель 4, 2014 06:49:28

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

Парсинг пространсва имен в XML

al1
разобрался. можно закрывать или удалять…
можешь показать как ты это сделал?

Офлайн

#8 Апрель 4, 2014 08:55:22

al1
Зарегистрирован: 2014-03-31
Сообщения: 5
Репутация: +  1  -
Профиль   Отправить e-mail  

Парсинг пространсва имен в XML

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, тогда будет парсится независимо от префикса и схем.

Отредактировано al1 (Апрель 4, 2014 08:56:30)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version