2016-06-01 1 views
0

Ниже приведен фрагмент кода из извлечения файла FODT:Извлечение данных с использованием LXML в Python из любого пространства имен атрибутов

<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" 
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text"> 

Я хочу, чтобы отделить содержание каждого пространства имен. Например, я хочу извлечь xmlns: office = "urn: oasis: names: tc: opendocument: xmlns: office: 1.0", xmlns: style = "urn: oasis: names: tc: opendocument: xmlns: style: 1.0" и т. д. включая сами имена пространства имен.

Как это сделать, используя lxml?

+0

Что вы имеете в виду "отделить содержание каждого пространства имен"? Вы просто хотите перечислить все объявленные пространства имен? – mzjn

+1

@mzjn Прошу прощения, если я не использую соответствующую терминологию. Из приведенного выше кода я хотел бы иметь список такого рода - '[xmlns: office =" urn: oasis: names: tc: opendocument: xmlns: office: 1.0 ", xmlns: text =" urn: oasis : names: tc: opendocument: xmlns: text: 1.0 ", ...]' –

ответ

2

Свойство nsmap на корневом элементе содержит словарь со всеми объявленными пространствами имен. Пример:

from lxml import etree 

XML = "your XML document here..." 

root = etree.fromstring(XML) 
for ns in sorted(root.nsmap.items()): 
    print ns 

Выход:

('calcext', 'urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0') 
('chart', 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0') 
('config', 'urn:oasis:names:tc:opendocument:xmlns:config:1.0') 
('css3t', 'http://www.w3.org/TR/css3-text/') 
('dc', 'http://purl.org/dc/elements/1.1/') 
('dom', 'http://www.w3.org/2001/xml-events') 
('dr3d', 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0') 
('draw', 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0') 
('drawooo', 'http://openoffice.org/2010/draw') 
('field', 'urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0') 
('fo', 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0') 
('form', 'urn:oasis:names:tc:opendocument:xmlns:form:1.0') 
('formx', 'urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0') 
('grddl', 'http://www.w3.org/2003/g/data-view#') 
('loext', 'urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0') 
('math', 'http://www.w3.org/1998/Math/MathML') 
('meta', 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0') 
('number', 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0') 
('of', 'urn:oasis:names:tc:opendocument:xmlns:of:1.2') 
('office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0') 
('officeooo', 'http://openoffice.org/2009/office') 
('ooo', 'http://openoffice.org/2004/office') 
('oooc', 'http://openoffice.org/2004/calc') 
('ooow', 'http://openoffice.org/2004/writer') 
('rpt', 'http://openoffice.org/2005/report') 
('script', 'urn:oasis:names:tc:opendocument:xmlns:script:1.0') 
('style', 'urn:oasis:names:tc:opendocument:xmlns:style:1.0') 
('svg', 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0') 
('table', 'urn:oasis:names:tc:opendocument:xmlns:table:1.0') 
('tableooo', 'http://openoffice.org/2009/table') 
('text', 'urn:oasis:names:tc:opendocument:xmlns:text:1.0') 
('xforms', 'http://www.w3.org/2002/xforms') 
('xhtml', 'http://www.w3.org/1999/xhtml') 
('xlink', 'http://www.w3.org/1999/xlink') 
('xsd', 'http://www.w3.org/2001/XMLSchema') 
('xsi', 'http://www.w3.org/2001/XMLSchema-instance') 
+0

Большое вам спасибо! Это был вопрос noob-ish, но он долгий путь в упрощении моей будущей работы :) –

+0

У меня есть другой вопрос. Если вы посмотрите на фрагмент кода в моем вопросе, это то, что вы увидите в конце - 'office: version =" 1.2 "office: mimetype =" application/vnd.oasis.opendocument.text "' Как это извлечь? Поскольку они не являются пространствами имен, я не могу их извлечь одинаково. –

+1

'office: version =" 1.2 "и' office: mimetype = "application/vnd.oasis.opendocument.text" 'являются регулярными атрибутами (а не объявлениями пространства имен). Они хранятся в свойстве 'attrib' на корневом элементе. Также доступен через метод 'items()'. См. Http://lxml.de/api/lxml.etree._Element-class.html. – mzjn