Как создать несколько тегов с одним и тем же именем с иерархией в python 3.x, используя l xml? - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу сгенерировать XML примерно так:

<linkbase>
  <presentationLink xlink:type="extended" xlink:role="http://www.rbi.org/in/xbrl/2012-12-07/role/Generalinformationaboutreportinginstitution">
    <loc xlink:type="locator" xlink:href="../core/in-rbi-rep.xsd#in-rbi-rep_GeneralInformationAboutReportingInstitutionAbstract" xlink:label="GeneralInformationAboutReportingInstitutionAbstract" xlink:title="GeneralInformationAboutReportingInstitutionAbstract"/>
    <loc xlink:type="locator" xlink:href="../core/in-rbi-rep.xsd#in-rbi-rep_DateOfQuarterEnded" xlink:label="DateOfQuarterEnded" xlink:title="DateOfQuarterEnded"/>
    <presentationArc xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="GeneralInformationAboutReportingInstitutionAbstract" xlink:to="DateOfQuarterEnded" xlink:title="presentation: GeneralInformationAboutReportingInstitutionAbstract to DateOfQuarterEnded" order="2.0"/>
    <loc xlink:type="locator" xlink:href="../core/in-rbi-rep.xsd#in-rbi-rep_NameOfReportingInstitution" xlink:label="NameOfReportingInstitution" xlink:title="NameOfReportingInstitution"/>
    <presentationArc xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="GeneralInformationAboutReportingInstitutionAbstract" xlink:to="NameOfReportingInstitution" xlink:title="presentation: GeneralInformationAboutReportingInstitutionAbstract to NameOfReportingInstitution" use="optional" order="1.0"/>
    <loc xlink:type="locator" xlink:href="../core/in-rbi-rep.xsd#in-rbi-rep_DateOfReport" xlink:label="DateOfReport" xlink:title="DateOfReport"/>
    <presentationArc xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="GeneralInformationAboutReportingInstitutionAbstract" xlink:to="DateOfReport" xlink:title="presentation: GeneralInformationAboutReportingInstitutionAbstract to DateOfReport" order="3.0"/>
    <loc xlink:type="locator" xlink:href="../core/in-rbi-rep.xsd#in-rbi-rep_ValidationStatus" xlink:label="ValidationStatus" xlink:title="ValidationStatus"/>
    <presentationArc xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="GeneralInformationAboutReportingInstitutionAbstract" xlink:to="ValidationStatus" xlink:title="presentation: GeneralInformationAboutReportingInstitutionAbstract to ValidationStatus" order="6.0"/>
  </presentationLink>
  <presentationLink xlink:type="extended" xlink:role="http://www.rbi.org/in/xbrl/2012-12-07/role/SignatoryInformation">
    <loc xlink:type="locator" xlink:href="../core/in-rbi-rep.xsd#in-rbi-rep_SignatoryAbstract" xlink:label="SignatoryAbstract" xlink:title="SignatoryAbstract"/>
    <loc xlink:type="locator" xlink:href="../core/in-rbi-rep.xsd#in-rbi-rep_NameOfSignatory" xlink:label="NameOfSignatory" xlink:title="NameOfSignatory"/>
    <presentationArc xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="SignatoryAbstract" xlink:to="NameOfSignatory" xlink:title="presentation: SignatoryAbstract to NameOfSignatory" order="1.0"/>
    <loc xlink:type="locator" xlink:href="../core/in-rbi-rep.xsd#in-rbi-rep_DesignationOfSignatory" xlink:label="DesignationOfSignatory" xlink:title="DesignationOfSignatory"/>
    <presentationArc xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="SignatoryAbstract" xlink:to="DesignationOfSignatory" xlink:title="presentation: SignatoryAbstract to DesignationOfSignatory" order="2.0"/>
    <loc xlink:type="locator" xlink:href="../core/in-rbi-rep.xsd#in-rbi-rep_PlaceOfSignature" xlink:label="PlaceOfSignature" xlink:title="PlaceOfSignature"/>
    <presentationArc xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child" xlink:from="SignatoryAbstract" xlink:to="PlaceOfSignature" xlink:title="presentation: SignatoryAbstract to PlaceOfSignature" order="3.0"/>
  </presentationLink>
</linkbase>

Я могу сгенерировать теги <presentationLink>, но не могу сгенерировать внутренние теги с порядком. Я думаю, мне нужно будет l oop через атрибут "order" внутри тега <presentationLink>, но как. Выше приведен тезис, который я взял из большого XML, который имеет отношение к вопросу. Мой текущий код выглядит следующим образом:

from openpyxl import load_workbook ### The tags come from an excel file
from lxml import etree
import xml.etree.ElementTree as xml

wb = load_workbook("t.xlsx")
ws = wb.worksheets[4]
m_row = ws.max_row
m_col = ws.max_column 

xlink = "http://www.w3.org/1999/xlink"
link = "http://www.xbrl.org/2003/linkbase"
role_prefix = "http://www.rbi.org/in/xbrl/2012-12-07/role/"
href_prefix = "in-rbi-alo-role.xsd#"
elem_type = ['extended', 'locator', 'resource', 'arc', 'simple']

ns = {None : link, 'xlink': xlink}
root = etree.Element("linkbase", nsmap = ns)
# print(root)
# print(root.tag)
print(etree.tostring(root, pretty_print=True).decode("utf-8"))

for i in range(1, m_row): 
    cell_objd = ws.cell(row = i+1, column = 4)
    cell_objf = ws.cell(row = i+1, column = 6)
    cell_objh = ws.cell(row = i+1, column = 8)
    if cell_objd.value == 'ELR':
        pl = etree.SubElement(root, "{" + link + "}presentationLink", attrib={"{" + xlink + "}type" : elem_type[0], "{" + xlink + "}role" : role_prefix + cell_objf.value})
        #print(cell_objd.value, cell_objf.value, cell_objh.value)
print(etree.tostring(root, pretty_print=True).decode("utf-8"))

Приведенный выше код генерирует следующее XML:

<linkbase xmlns="http://www.xbrl.org/2003/linkbase" xmlns:xlink="http://www.w3.org/1999/xlink">
  <roleRef roleRef="http://www.rbi.org/in/xbrl/2012-12-07/role/Generalinformationaboutreportinginstitution" xlink:type="simple" xlink:href="in-rbi-alo-role.xsd#Generalinformationaboutreportinginstitution"/>
  <roleRef roleRef="http://www.rbi.org/in/xbrl/2012-12-07/role/ReportOnAssetsLiabilitiesAndOtherProducts" xlink:type="simple" xlink:href="in-rbi-alo-role.xsd#ReportOnAssetsLiabilitiesAndOtherProducts"/>
  <roleRef roleRef="http://www.rbi.org/in/xbrl/2012-12-07/role/AnnexureIDetailsOfOffBalanceSheetExposures" xlink:type="simple" xlink:href="in-rbi-alo-role.xsd#AnnexureIDetailsOfOffBalanceSheetExposures"/>
  <roleRef roleRef="http://www.rbi.org/in/xbrl/2012-12-07/role/AnnexureII" xlink:type="simple" xlink:href="in-rbi-alo-role.xsd#AnnexureII"/>
  <roleRef roleRef="http://www.rbi.org/in/xbrl/2012-12-07/role/Signatoryinformation" xlink:type="simple" xlink:href="in-rbi-alo-role.xsd#Signatoryinformation"/>
  <presentationLink xlink:type="extended" xlink:role="http://www.rbi.org/in/xbrl/2012-12-07/role/Generalinformationaboutreportinginstitution"/>
  <presentationLink xlink:type="extended" xlink:role="http://www.rbi.org/in/xbrl/2012-12-07/role/ReportOnAssetsLiabilitiesAndOtherProducts"/>
  <presentationLink xlink:type="extended" xlink:role="http://www.rbi.org/in/xbrl/2012-12-07/role/AnnexureIDetailsOfOffBalanceSheetExposures"/>
  <presentationLink xlink:type="extended" xlink:role="http://www.rbi.org/in/xbrl/2012-12-07/role/AnnexureII"/>
  <presentationLink xlink:type="extended" xlink:role="http://www.rbi.org/in/xbrl/2012-12-07/role/Signatoryinformation"/>
</linkbase>

Как вы можете видеть, <presentationLink> генерируется, но я не могу сделать внутренние теги. Я надеюсь, что вопрос ясен. Я могу предоставить точное превосходство, из которого мне нужно сгенерировать XML, если требуется. Любая помощь приветствуется.

Спасибо.

...