I am transforming word documents to xml to compare them using the following code:
word = win32com.client.Dispatch('Word.Application')
wd = word.Documents.Open(inFile)
# Converts the word infile to xml outfile
wd.SaveAs(outFile,11)
wd.Close()
dom=parse(outFile)
The xml file I get looks like:
...
...
...
I can't use xpath function (lxml library)
when I try for example :
import lxml.etree as et
tree = et.parse(xmlFile)
for elt in tree.xpath("//w:gridCol"):
elt.getparent().remove(elt)
I get the following error:
for elt in tree.xpath("//w:gridCol"):
File "lxml.etree.pyx", line 2029, in lxml.etree._ElementTree.xpath (src/lxml/lxml.etree.c:45934)
File "xpath.pxi", line 379, in lxml.etree.XPathDocumentEvaluator.__call__ (src/lxml/lxml.etree.c:114389)
File "xpath.pxi", line 242, in lxml.etree._XPathEvaluatorBase._handle_result (src/lxml/lxml.etree.c:113063)
File "xpath.pxi", line 227, in lxml.etree._XPathEvaluatorBase._raise_eval_error (src/lxml/lxml.etree.c:112894)
XPathEvalError: Undefined namespace prefix
I did some research and I guess it's a namespace matter, but I don't know how to fix it?
解决方案
In this code:
for elt in tree.xpath("//w:gridCol"):
w: isn't a namespace; it's a namespace prefix which is effectively shorthand for the actual namespace,
http://schemas.microsoft.com/office/word/2003/wordml. If you want to search for elements in this namespace using the xpath method, you need to provide it with a mapping of namespace prefixes to namespaces:
tree.xpath("//w:gridCol", namespaces={
'w': 'http://schemas.microsoft.com/office/word/2003/wordml',
})
Also, note that there is no requirement that you use the same
namespace prefix. The following would find the same elements:
tree.xpath("//bob:gridCol", namespaces={
'bob': 'http://schemas.microsoft.com/office/word/2003/wordml'
})