2014-09-14 1 views
0

В основном я создал текстовый документ, чтобы проверить, как синтаксический анализ в тарифах XML. Я сделал:Слова предложения, появляющиеся в отдельных узлах, Elementtree

import xml.etree.ElementTree 
import zipfile as zf 
z = zf.ZipFile("INTRODUCTION.docx") 
doc_xml = z.open("word/document.xml") 

tree = ET.parse(doc_xml) 

NAMESPACE_PREFIXES = { 
    'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main' 
    } 


text_elements = [element for element in tree.iter() if element.tag == 
'{' + NAMESPACE_PREFIXES['w'] + '}t'] 
for node in text_elements: 
    print node.text 

Префиксы пространства имен должны позаботиться об этих ссылках, чтобы они игнорировались. Node.text отпечатались как:

INTRODUCTION 
This is a test document for xml 
. 
Lets 
see how this works. 
Conclusion 
It should hopefully 
.. 

В моем оригинальном документе, Lets see how this works поставляется в одной строке, так же, я вижу торможений одного и того же предложения появляются в отдельных узлах (как «..») , Как это решить? Вот код XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n 
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 wp14"> 
    <w:body> 
     <w:p w:rsidR="00470EEF" w:rsidRDefault="00456755"><w:pPr><w:rPr><w:b/></w:rPr></w:pPr><w:r w:rsidRPr="00456755"><w:rPr><w:b/></w:rPr><w:t>INTRODUCTION</w:t></w:r></w:p> 
     <w:p w:rsidR="00456755" w:rsidRDefault="00456755"><w:r w:rsidRPr="00456755"><w:t>This is a test document for xml</w:t></w:r><w:r><w:t>.</w:t></w:r></w:p> 
     <w:p w:rsidR="00456755" w:rsidRDefault="00456755"><w:proofErr w:type="spellStart"/><w:proofErr w:type="gramStart"/><w:r><w:t>Lets</w:t></w:r><w:proofErr w:type="spellEnd"/><w:proofErr w:type="gramEnd"/><w:r><w:t xml:space="preserve"> see how this works.</w:t></w:r></w:p> 
     <w:p w:rsidR="00456755" w:rsidRDefault="00456755"/> 
     <w:p w:rsidR="00456755" w:rsidRDefault="00456755"/> 
     <w:p w:rsidR="00456755" w:rsidRDefault="00456755"><w:pPr><w:rPr><w:b/></w:rPr></w:pPr><w:r w:rsidRPr="00456755"><w:rPr><w:b/></w:rPr><w:t>Conclusion</w:t></w:r></w:p> 
     <w:p w:rsidR="00456755" w:rsidRPr="00456755" w:rsidRDefault="00456755"><w:r w:rsidRPr="00456755"><w:t>It should hopefully</w:t></w:r><w:r><w:t>..</w:t></w:r><w:bookmarkStart w:id="0" w:name="_GoBack"/><w:bookmarkEnd w:id="0"/></w:p> 
     <w:sectPr w:rsidR="00456755" w:rsidRPr="00456755"><w:pgSz w:w="11906" w:h="16838"/><w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="708" w:footer="708" w:gutter="0"/><w:cols w:space="708"/><w:docGrid w:linePitch="360"/></w:sectPr> 
    </w:body> 
</w:document> 

Я заметил, что-то вроде w:type="spellStart" и "grasmStart" который является причиной, почему Lets появляется в другом узле. Есть ли способ взглянуть на это?

ответ

1

print заявление добавить новую строку после строки, которую вы печатаете.

Вам нужно сгруппировать метки по p Теги: Найти p теги и найти t теги внутри них.

... 
w = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'  
for p in tree.findall('.//{' + w + '}p'): 
    print ''.join(t.text for t in p.findall('.//{' + w + '}t')) 

выход:

INTRODUCTION 
This is a test document for xml. 
Lets see how this works. 


Conclusion 
It should hopefully.. 
+0

спасибо, не могли бы вы объяснить, что на самом деле происходит, и как это фиксирует это ..? –

+0

@Swordy, я думаю, что редактировал ответ (добавив объяснение), пока вы комментировали. Повторите ответ. – falsetru

+0

@Swordy, для выражения, переданного 'findall', см. Документацию' 'xml.etree.ElementTree' - XPath Support] (https://docs.python.org/2/library/xml.etree.elementtree.html # XPath-поддержка). – falsetru

Смежные вопросы