Как учесть амперсанды в xml с помощью xmlformatter - PullRequest
0 голосов
/ 31 декабря 2018

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

К сожалению, ElementTree не форматирует добавленное в xml.Это просто оставляет все в одной строке.Чтобы исправить это, я импортировал xmlformatter.xmlformatter прекрасно работает, но он меняет мой (точка с запятой амперсанда) на фактические кавычки внутри xml, потому что рассматриваемый xml-файл имеет символ «&» для представления кавычек.

Вот пример кода xml:

    <override action="replaceElement" path="pdf-        
    list/pdf[@name="HfsSdbWks" ]">
    <element name="pdf">
    <attribute name="size" value="186"></attribute>
    <attribute name="name" value="HfsSdbWks"></attribute>
    <attribute name="path" 
    value="/clientFolder/downloads/HFS_SDB_Wks.pdf"> 
    </attribute>
    <attribute name="devPath" 
    value="/clientFolder/downloads/HFS_SDB_Wks.pdf"></attribute>
    </element>
    </override>

Так что моя проблема на самом деле: каков наилучший способ учесть это и?

Мой личный подходчтобы исправить это, нужно было сначала прочитать весь файл в строку.Затем замените внутри этой строки все вхождения &quot; на 1234abcd или в основном любой вид уникальной строки символов, которая сохраняет XML-файл нетронутым, который я затем смогу вернуть после форматирования.

    def createPdfOvr(self, ovrCopy):  #these are methods inside a class

    if self.xml_string != '':
        with open(self.OVR_COPY, 'w') as f:
            f.write(self.xml_string)


    def formatXML(self, xml_string):
    formatted_xml =  
    xml.Formatter().format_string(self.xml_string).decode("utf-8")
    self.xml_string = formatted_xml.replace('abc1234', '&quot;')

В настоящее время у меня ожидаемые результаты.Это обновленный XML-файл, который имеет все новые узлы / атрибуты и отформатирован для чтения.Вот код:

    overrides parent="runtime/view/PDF.xml" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="FndtOverridesSchema.xsd">
    <override action="replaceElement" path="pdf- 
   list/pdf[@name=&quot;HfsSdbWks&quot; ]">
   <element name="pdf">
   <attribute name="size" value="186"></attribute>
   <attribute name="name" value="HfsSdbWks"></attribute>
   <attribute name="path" 
   value="/01040_ybr_ybrfndt/downloads/HFS_SDB_Wks.pdf"></attribute>
   <attribute name="devPath" 
   value="/01040_ybr_ybrfndt/downloads/HFS_SDB_Wks.pdf"></attribute>
   </element>
   </override>
   <----This is the new node that was added---->
   <override action="replaceElement" path="pdf- 
   list/pdf[@name=&quot;Hippa&quot; ]">
   <element name="pdf">
   <attribute name="size" value="129"></attribute>
   <attribute name="name" value="Hippa"></attribute>
   <attribute name="path" value="/01040_ybr_ybrfndt/downloads/Hippa.pdf"> 
   </attribute>
   <attribute name="devPath" 
   value="/01040_ybr_ybrfndt/downloads/Hippa.pdf"></attribute>
   </element>
   </override>

1 Ответ

0 голосов
/ 31 декабря 2018

Как правило, синтаксический анализ XML и его повторная сериализация приводят к потере информации, которую XML считает несущественной - например, дополнительные пробелы между атрибутами в начальном теге, порядок атрибутов, избыточные объявления пространства имен илиразличие между &quot; и ".

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

...