首页 > 解决方案 > 如何在 python 中创建带有实体的 DOCTYPE

问题描述

我希望用 ENTITIES 创建一些 gdml,如下所示

<!DOCTYPE gdml [
<!ENTITY define SYSTEM "define.xml">
<!ENTITY materials SYSTEM "materials.xml">
<!ENTITY solids SYSTEM "fredF4-solids.xml">
<!ENTITY structure SYSTEM "fredF4-structure.xml">
]>

我创建了一个字符串

docString ='<!DOCTYPE gdml [<!ENTITY define SYSTEM "define.xml"><!ENTITY materials SYSTEM "materials.xml"><!ENTITY solids SYSTEM "fredF4-solids.xml"><!ENTITY structure SYSTEM "fredF4-structure.xml">]>'

但是如果我编码 elem = ET.fromstring(docString)

我得到一个错误,同样的

  elem = ET.XML(docString)
  File "src/lxml/etree.pyx", line 3216, in lxml.etree.XML
  File "src/lxml/parser.pxi", line 1896, in lxml.etree._parseMemoryDocument
  File "src/lxml/parser.pxi", line 1777, in lxml.etree._parseDoc
  File "src/lxml/parser.pxi", line 1082, in lxml.etree._BaseParser._parseUnicodeDoc
  File "src/lxml/parser.pxi", line 615, in lxml.etree._ParserContext._handleParseResultDoc
  File "src/lxml/parser.pxi", line 725, in lxml.etree._handleParseResult
  File "src/lxml/parser.pxi", line 654, in lxml.etree._raiseParseError
  <class 'lxml.etree.XMLSyntaxError'>: Start tag expected, '<' not found, line 1, column 189    (<string>, line 1)

我应该指出我正在尝试将 !DOCTYPE 信息添加为 GDML 文件的一部分,该文件目前已成功地最初声明为

  !NS = 'http://www.w3.org/2001/XMLSchema-instance'
  location_attribute = '{%s}noNameSpaceSchemaLocation' % NS
  gdml = ET.Element('gdml',attrib={location_attribute: 'http://service-spi.web.cern.ch/service-spi/app/releases/GDML/schema/gdml.xsd'})

标签: python-3.xxmllxml

解决方案


另一种选择是在函数方法doctype中使用arg 。tostring()write()

例子...

etree.tostring(gdml, doctype=docString).decode()

或者

etree.ElementTree(gdml).write("output.xml", doctype=docString)

推荐阅读