Создание начала файла GDML из строки - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь использовать этот код

s = """<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gdml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:noNamespaceSchemaLocation="http://service-spi.web.cern.ch/service-spi/app/releases/GDML/schema/gdml.xsd">"""

       doctype = """<!DOCTYPE doc [
       <!ENTITY ent SYSTEM "another_doc.xml">
       ]>""" 

       gdml = ET.fromstring(s.encode("UTF-8"))

Но получаю XMLSyntaxError: EndTag

Я хочу со временем добавить также тип документа

1 Ответ

0 голосов
/ 27 февраля 2020

Строка, которую вы передаете fromstring(), должна быть правильной XML. Так как у вас есть только стартовый тег, он не правильно сформирован.

Это легко разрешить, закрыв его самостоятельно или добавив конечный тег.

Кроме того, если вы хотите, чтобы объявление XML (<?xml ...?>) было включено в сериализованный XML, Вы можете добавить его к doctype.

Пример ...

from lxml import etree

s = """<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gdml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="http://service-spi.web.cern.ch/service-spi/app/releases/GDML/schema/gdml.xsd"/>"""

doctype = """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE gdml [
<!ENTITY ent SYSTEM "another_doc.xml">
]>"""

gdml = etree.fromstring(s.encode("UTF-8"))
print(etree.tostring(gdml, doctype=doctype).decode())

Это печатает ...

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE gdml [
<!ENTITY ent SYSTEM "another_doc.xml">
]>
<gdml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://service-spi.web.cern.ch/service-spi/app/releases/GDML/schema/gdml.xsd"/>
...