1

一点背景知识:在 Sphinx 需求管理插件的范围内,我正在研究导出 ReqIF XML 内容的方法。我找到了 pyreqif,但发现它目前还不够完整,无法满足我们的需求。

我决定看一下由 pyXB 生成的 Reqif 绑定,因为 pyXB 可以完成将事物与 XML 相互转换的所有繁重工作,我只需要担心添加一些便利函数/类。

该项目可以在这里找到:https ://github.com/bavovanachte/reqif_pyxb_tryout

到目前为止一切都很好:我已经成功地创建了所有对象的实例,并且它们很好地结合在一起形成了一个 xml 文档。我唯一遇到的问题是创建 XHTML 内容。理想情况下,我想获取现有的 html 内容并将其插入到树中。这样做的幼稚方法导致 xml-unsafe 字符被转义,因此不起作用。

这些是我的一些尝试:

尝试 1:将 xml 作为字符串传递给 XHTML_CONTENT 构造函数

xml_string = '''
<div>
    XY Block Adapter shall translate the Communication to TMN-Block in a bidirectional manner and support all functionalities of a TMN-Block.<br/>
</div>'''
att_value_xhtml = ATTRIBUTE_VALUE_XHTML(definition=text_attribute, THE_VALUE=XHTML_CONTENT(div=xml_string))

结果:转义的 XML 内容:

&lt;div&gt;
    XY Block Adapter shall translate the Communication to TMN-Block in a bidirectional manner and support all functionalities of a TMN-Block.&lt;br/&gt;
&lt;/div&gt;</ns2:div>

尝试 2:将 xml 作为字符串传递给 XHTML_CONTENT 构造函数,并设置“_from_xml 标志”

xml_string = '''
<div>
    XY Block Adapter shall translate the Communication to TMN-Block in a bidirectional manner and support all functionalities of a TMN-Block.<br/>
</div>'''
att_value_xhtml = ATTRIBUTE_VALUE_XHTML(definition=text_attribute, THE_VALUE=XHTML_CONTENT(xml_string, _from_xml=True))

结果:pyXB 异常:

 Traceback (most recent call last):
   File "examples/export_test.py", line 105, in <module>
     att_value_xhtml = ATTRIBUTE_VALUE_XHTML(definition=text_attribute, THE_VALUE=XHTML_CONTENT(xml_string, _from_xml=True))
   File "/home/bvn/.pyenv/versions/3.6.10/lib/python3.6/site-packages/pyxb/binding/basis.py", line 2127, in __init__
     self.extend(args, _from_xml=from_xml, _location=location)
   File "/home/bvn/.pyenv/versions/3.6.10/lib/python3.6/site-packages/pyxb/binding/basis.py", line 2612, in extend
     [ self.append(_v, **kw) for _v in value_list ]
   File "/home/bvn/.pyenv/versions/3.6.10/lib/python3.6/site-packages/pyxb/binding/basis.py", line 2612, in <listcomp>
     [ self.append(_v, **kw) for _v in value_list ]
   File "/home/bvn/.pyenv/versions/3.6.10/lib/python3.6/site-packages/pyxb/binding/basis.py", line 2588, in append
     raise pyxb.MixedContentError(self, value, location)
 pyxb.exceptions_.MixedContentError: Invalid non-element content

尝试编号 3 - 将 xml 作为字符串传递给 xhtml_div_type 构造函数,并设置“_from_xml 标志”,然后将此类分配给 div 成员。

xml_string = '''
<div>
    XY Block Adapter shall translate the Communication to TMN-Block in a bidirectional manner and support all functionalities of a TMN-Block.<br/>
</div>'''
att_value_xhtml = ATTRIBUTE_VALUE_XHTML(definition=text_attribute, THE_VALUE=XHTML_CONTENT(div=xhtml_div_type(xml_string, _from_xml=True)))

结果:转义的 XML 内容:

&lt;div&gt;
    XY Block Adapter shall translate the Communication to TMN-Block in a bidirectional manner and support all functionalities of a TMN-Block.&lt;br/&gt;
&lt;/div&gt;</ns2:div>

尝试号 4 - 首先将字符串转换为 dom 并在构造函数中使用它

xml_string = '''
<div>
    XY Block Adapter shall translate the Communication to TMN-Block in a bidirectional manner and support all functionalities of a TMN-Block.<br/>
</div>'''
dom_content = xml.dom.minidom.parseString('<myxml>Some data<empty/> some more data</myxml>')
att_value_xhtml = ATTRIBUTE_VALUE_XHTML(definition=text_attribute, THE_VALUE=XHTML_CONTENT(div=xhtml_div_type(_dom_node=dom_content)))

结果:pyXB 异常:

Unable to convert DOM node empty at [UNAVAILABLE] to binding
Traceback (most recent call last):
  File "examples/export_test.py", line 130, in <module>
    att_value_xhtml = ATTRIBUTE_VALUE_XHTML(definition=text_attribute, THE_VALUE=XHTML_CONTENT(div=xhtml_div_type(_dom_node=dom_content)))
  File "/home/bvn/.pyenv/versions/3.6.10/lib/python3.6/site-packages/pyxb/binding/basis.py", line 2133, in __init__
    self.extend(dom_node.childNodes[:], fallback_namespace)
  File "/home/bvn/.pyenv/versions/3.6.10/lib/python3.6/site-packages/pyxb/binding/basis.py", line 2612, in extend
    [ self.append(_v, **kw) for _v in value_list ]
  File "/home/bvn/.pyenv/versions/3.6.10/lib/python3.6/site-packages/pyxb/binding/basis.py", line 2612, in <listcomp>
    [ self.append(_v, **kw) for _v in value_list ]
  File "/home/bvn/.pyenv/versions/3.6.10/lib/python3.6/site-packages/pyxb/binding/basis.py", line 2567, in append
    raise pyxb.UnrecognizedContentError(self, self.__automatonConfiguration, value, location)
pyxb.exceptions_.UnrecognizedContentError: Invalid content empty (expect {http://www.w3.org/1999/xhtml}h1 or {http://www.w3.org/1999/xhtml}h2 or ...

处理 xhtml 内容的正确方法是什么?

4

0 回答 0