如何在 python 中创建包含 ENTITIES 的 DOCTYPE

How do I create a DOCTYPE with ENTITIES in python

我希望创建一些带有 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'})

谢谢丹尼尔

我通过

设法添加了没有 gdml 元素的 DocString
  !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'})

  docString += ET.tostring(gdml).decode("UTF-8"))
  gdml = ET.fromstring(docString.encode("UTF-8"))

另一种选择是在 tostring() function or the write() method.

中使用 doctype arg

示例...

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

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