繁体   English   中英

如何查看python-docx包生成的XML

[英]How do I view the XML produced by the python-docx package

出于单元测试的目的,我想检查为Word段落生成的XML是否是我在解析HTML段落时所期望的。

如何提取XML本身而不是写入文件,解压缩文件,并重新读取它包含的word / document.xml文件?

例如

from docx import Document
import bs4

def add_parsed_html_to_paragraph(p, s):
    soup = bs4.BeautifulSoup(s)
    para = soup.find('p')
    for e in para.children:
        if type(e) == bs4.element.NavigableString:
            r = p.add_run(str(e))
        else:
            r = p.add_run(e.text)
        if e.name == 'sub':
            r.font.subscript = True
        elif e.name == 'sup':
            r.font.superscript = True


title = 'A formula: H<sub>2</sub>O.'

document = Document()
p = document.add_paragraph()
add_parsed_html_to_paragraph(p, title)

# ... Now I want to check p or document for the correct XML

python-docx中的每个所谓的oxml元素对象都有一个.xml属性,正是这个用例。 它用于内部单元测试。

您只需要访问用于XML元素的内部变量,通常可以通过单击文档中该对象旁边的[source]链接获得,如下所示: https//python-docx.readthedocs.io/en /latest/api/text.html#paragraph-objects

单击该链接,您可以找到对于段落,基础XML元素在._p._p 通常它是没有命名空间前缀的元素的标记名,尽管有时它是通用的._element 如果你需要猜测的话,后者是一个很好的尝试。

所以使用它就像这样简单:

>>> paragraph._p.xml
<w:p>
  <w:pPr>
    <w:jc w:val="right"/>
  </w:pPr>
  <w:r>
    <w:t>Right-aligned</w:t>
  </w:r>
</w:p>

在称为CXML(compact XML)的单元测试实用程序中有一个伴随域特定语言(DSL),它允许您处理命名空间,否则这是一个很大的痛苦。 它看起来像这样:

expected_xml = cxml.xml('w:p(w:pPr/w:jc{w:val=right},w:r/w:t"Right-aligned")')

您可以在整个单元测试中看到示例,如下所示: https//github.com/python-openxml/python-docx/blob/master/tests/text/test_paragraph.py#L113并在此处询问有关“python”的更多具体问题-docx“标记,如果你需要帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM