如何查看 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
中的每个 so-called oxml
元素对象都有一个 .xml
属性 正是这个用例。它用于内部单元测试。
您只需要访问用于 XML 元素的内部变量,通常可以通过单击文档中该对象旁边的 [source]
link 来访问它,例如这里:https://python-docx.readthedocs.io/en/latest/api/text.html#paragraph-objects
单击 link,您可以发现对于某个段落,基础 XML 元素在 ._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(紧凑的 XML)的 unit-test 实用程序中有一个配套的 domain-specific 语言 (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" 标签提出更具体的问题。
出于单元测试的目的,我想检查为 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
中的每个 so-called oxml
元素对象都有一个 .xml
属性 正是这个用例。它用于内部单元测试。
您只需要访问用于 XML 元素的内部变量,通常可以通过单击文档中该对象旁边的 [source]
link 来访问它,例如这里:https://python-docx.readthedocs.io/en/latest/api/text.html#paragraph-objects
单击 link,您可以发现对于某个段落,基础 XML 元素在 ._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(紧凑的 XML)的 unit-test 实用程序中有一个配套的 domain-specific 语言 (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" 标签提出更具体的问题。