Возникли проблемы при получении XML для правильного отступа с pretty_print - PullRequest
0 голосов
/ 08 октября 2019

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

import xml.etree.cElementTree as ETXML
import lxml.etree as etree
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import string
import shutil
import os
import sys
import codecs
from xml.dom import minidom

pd.options.mode.chained_assignment = None
VARINFO = pd.read_excel(open('Input.xlsx', 'rb'),"VAR_INFO")
VALINFO = pd.read_excel(open('Input.xlsx', 'rb'),"VAL_INFO")


df2=VARINFO.copy()
df2=df2.drop(df2[df2.column_tables == 0].index)

df3=VALINFO.copy()
df3=df3.drop(df3[df3.column_var == 0].index)

df4=VARINFO.copy()
df4=df4.drop(df4[df4.row_tables == 0].index)

df5=VALINFO.copy()
df5=df5.drop(df5[df5.row_var == 0].index)

root = ETXML.Element("paramname", version="1.0", createdBy="PowerStats v1.0")    # Create root element
columns = ETXML.SubElement(root, "columns")
rows = ETXML.SubElement(root, "rows")
component = ETXML.SubElement(columns, "component")
rcomponent = ETXML.SubElement(rows, "component")
element = ETXML.SubElement(component, "element")




def colcmp(row, x):
    colxml = ETXML.SubElement(component, "component", label=str(VARINFO.var_label.unique().tolist()[x]), varname=str(VARINFO.var_name.unique().tolist()[x]), format="DISC", missingValue="-3", tag="tag" )
    newDF = df3.loc[df3.var_name == row]
    val_label = newDF.val_label.tolist()
    element = ETXML.SubElement(component, "element")
    for i in range(len(val_label)):
         rowinfo = ETXML.SubElement(element, "element", label=str(newDF.val_label.tolist()[i]), varname=str(newDF.var_name.tolist()[i]), format="DISC", missingValue="-3", tag="tag" )

def rowcmp(row, x):   
    rowxml = ETXML.SubElement(rcomponent, "component", label=str(df4.var_label.unique().tolist()[x]), varname=str(df4.var_name.unique().tolist()[x]), format="DISC", missingValue="-3", tag="tag" )
    newDFR = df5.loc[df5.var_name == row]
    val_label = newDFR.val_label.tolist()
    relement = ETXML.SubElement(rcomponent, "element")
    for i in range(len(val_label)):
         rinfo = ETXML.SubElement(relement, "element", label=str(newDFR.val_label.tolist()[i]), varname=str(newDFR.var_name.tolist()[i]), format="DISC", missingValue="-3", tag="tag" )

list1 = df2.var_name.tolist()
list2 = df3.var_name.tolist()
list3 = df4.var_name.tolist()
list4 = df5.var_name.tolist()

for rows in range (len(list1)):
    rowinfo = colcmp(list1[rows], rows)

for rows in range (len(list3)):
    rinfo = rowcmp(list3[rows], rows)

rootWrite = ETXML.ElementTree(root)
rootWrite.write("createXml.txt")

with open(r'createXml.txt', 'r') as infile, \
     open(r'createXml2.xml', 'w') as outfile:
    data = infile.read()
    data = data.replace("<component>", "")
    data = data.replace("<element>", "")
    data = data.replace("</component>", "")
    data = data.replace("</element>", "")
    data = data.replace("<element />", "")
    outfile.write(data)



xmlstr = minidom.parse("createXml2.xml").toprettyxml(indent="   ")
with open("createXml2.xml", "w") as f:
    f.write(xmlstr)

print(xmlstr) 

Единственная проблема заключается в том, что полученный XML-файл выглядит следующим образом:

<?xml version="1.0" ?>
<paramname createdBy="PowerStats v1.0" version="1.0">
   <columns>
      <component format="fmat" label="varlabel1" missingValue="-3" tag="tag" varname="var1"/>
      <element format="fmat" label="item1" missingValue="-3" tag="tag" varname="var1"/>
      <element format="fmat" label="item1" missingValue="-3" tag="tag" varname="var1"/>
      <element format="fmat" label="item1" missingValue="-3" tag="tag" varname="var1"/>
      <element format="fmat" label="item1" missingValue="-3" tag="tag" varname="var1"/>
      <component format="fmat" label="varlabel2" missingValue="-3" tag="tag" varname="var2"/>
      <element format="fmat" label="item1" missingValue="-3" tag="tag" varname="var2"/>
      <element format="fmat" label="item2" missingValue="-3" tag="tag" varname="var2"/>
      <element format="fmat" label="item3" missingValue="-3" tag="tag" varname="var2"/>
      <element format="fmat" label="item4" missingValue="-3" tag="tag" varname="var2"/>
   </columns>
</paramname>

Когда то, что мне действительно нужно: Единственная проблема заключается в том, что полученный XML-файлвыглядит так:

<?xml version="1.0" ?>
<paramname createdBy="PowerStats v1.0" version="1.0">
   <columns>
      <component format="fmat" label="varlabel1" missingValue="-3" tag="tag" varname="var1"/>
          <element format="fmat" label="item1" missingValue="-3" tag="tag" varname="var1"/>
          <element format="fmat" label="item1" missingValue="-3" tag="tag" varname="var1"/>
          <element format="fmat" label="item1" missingValue="-3" tag="tag" varname="var1"/>
          <element format="fmat" label="item1" missingValue="-3" tag="tag" varname="var1"/>
      <component format="fmat" label="varlabel2" missingValue="-3" tag="tag" varname="var2"/>
          <element format="fmat" label="item1" missingValue="-3" tag="tag" varname="var2"/>
          <element format="fmat" label="item2" missingValue="-3" tag="tag" varname="var2"/>
          <element format="fmat" label="item3" missingValue="-3" tag="tag" varname="var2"/>
          <element format="fmat" label="item4" missingValue="-3" tag="tag" varname="var2"/>
   </columns>
</paramname>

Элемент должен быть подэлементом компонента, но pretty-print, похоже, не относится к этому так. Я не могу сказать, неправильно ли я декларирую где-то в программе, или есть какое-то ограничение на количество идентификаторов с pretty_print. Я не очень опытен с cElementTree / ElementTree. Любая помощь была бы великолепна.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...