Включение содержимого XHTML при создании документа ReqIf XML с использованием pyXB

Немного предыстории: в рамках подключаемого модуля управления требованиями для Sphinx я ищу способы экспортировать XML-контент ReqIF. Я нашел pyreqif, но обнаружил, что на данный момент он недостаточно полный, чтобы удовлетворить наши потребности.

Я решил вместо этого взглянуть на привязки Reqif, сгенерированные pyXB, с идеей, что pyXB может выполнять всю тяжелую работу по преобразованию вещей в XML и из XML, и мне просто нужно беспокоиться о добавлении некоторых удобных функций / классов.

Проект можно найти здесь: https://github.com/bavovanachte/reqif_pyxb_tryout

Пока все идет отлично: мне удалось создать экземпляры всех объектов, и они красиво связаны в документ xml. Единственное, с чем у меня проблемы, - это создание контента XHTML. В идеале я бы хотел взять существующий HTML-контент и вставить его в дерево. Наивный подход, при котором символы, небезопасные для xml, были экранированы, так что это не сработало.

Вот некоторые из моих попыток:

Попытка 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?

0 ответов

Другие вопросы по тегам