вставьте строку дерева xml в тег Beautifulsoup - PullRequest
1 голос
/ 11 июня 2019

У меня есть XML-дерево в виде строки.Я хочу вставить это дерево в другой тег внутри объекта Beautifulsoup.

Я хочу вставить строку stra внутри тега <voucher action="Create" objview="Accounting Voucher View" vchtype="Journal">.

В исходном файле ничего нет внутритег ваучера.

Код:

from bs4 import BeautifulSoup as bs

stra = r'''<DATE>20190101</DATE>
      <VOUCHERTYPENAME>Journal</VOUCHERTYPENAME>
      <VOUCHERNUMBER>5</VOUCHERNUMBER>
      <PERSISTEDVIEW>Accounting Voucher View</PERSISTEDVIEW>
      <EFFECTIVEDATE>20190101</EFFECTIVEDATE>    
      <MASTERID> 1</MASTERID>

      <ALLLEDGERENTRIES.LIST>
       <LEDGERNAME>Salary Payable</LEDGERNAME>
       <ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
       <AMOUNT>1000.00</AMOUNT>
       <VATEXPAMOUNT>1000.00</VATEXPAMOUNT>
      </ALLLEDGERENTRIES.LIST>'''
newsoup=bs(stra)

f = open(r"F:\Users\Administrator\Desktop\TallyJVXml.txt").read()
soup = bs(f,'lxml')
l = soup.find("voucher".lower())
l.append(stra)
print(soup)

Токовый выход:

<html><body><envelope>
<header>
<tallyrequest>Import Data</tallyrequest>
</header>
<importdata>
<requestdesc>
<reportname>Vouchers</reportname>
<staticvariables>
<svcurrentcompany>SOAC</svcurrentcompany>
</staticvariables>
</requestdesc>
<requestdata>
<tallymessage xmlns:udf="TallyUDF">
<voucher action="Create" objview="Accounting Voucher View" vchtype="Journal">
&lt;DATE&gt;20190101&lt;/DATE&gt;
      &lt;VOUCHERTYPENAME&gt;Journal&lt;/VOUCHERTYPENAME&gt;
      &lt;VOUCHERNUMBER&gt;5&lt;/VOUCHERNUMBER&gt;
      &lt;PERSISTEDVIEW&gt;Accounting Voucher View&lt;/PERSISTEDVIEW&gt;
      &lt;EFFECTIVEDATE&gt;20190101&lt;/EFFECTIVEDATE&gt;    
      &lt;MASTERID&gt; 1&lt;/MASTERID&gt;

      &lt;ALLLEDGERENTRIES.LIST&gt;
       &lt;LEDGERNAME&gt;Salary Payable&lt;/LEDGERNAME&gt;
       &lt;ISDEEMEDPOSITIVE&gt;No&lt;/ISDEEMEDPOSITIVE&gt;
       &lt;AMOUNT&gt;1000.00&lt;/AMOUNT&gt;
       &lt;VATEXPAMOUNT&gt;1000.00&lt;/VATEXPAMOUNT&gt;
      &lt;/ALLLEDGERENTRIES.LIST&gt;</voucher>
</tallymessage>
</requestdata>
</importdata>
</envelope>
</body></html>

Требуемый выход:

<ENVELOPE>
 <HEADER>
  <TALLYREQUEST>Import Data</TALLYREQUEST>
 </HEADER>
 <BODY>
  <IMPORTDATA>
   <REQUESTDESC>
    <REPORTNAME>Vouchers</REPORTNAME>
    <STATICVARIABLES>
     <SVCURRENTCOMPANY>SOAC</SVCURRENTCOMPANY>
    </STATICVARIABLES>
   </REQUESTDESC>
   <REQUESTDATA>
    <TALLYMESSAGE xmlns:UDF="TallyUDF">
     <VOUCHER VCHTYPE="Journal" ACTION="Create" OBJVIEW="Accounting Voucher View">
              <DATE>20190101</DATE>
      <VOUCHERTYPENAME>Journal</VOUCHERTYPENAME>
      <VOUCHERNUMBER>5</VOUCHERNUMBER>
      <PERSISTEDVIEW>Accounting Voucher View</PERSISTEDVIEW>
      <EFFECTIVEDATE>20190101</EFFECTIVEDATE>

      <MASTERID> 1</MASTERID>

      <ALLLEDGERENTRIES.LIST>
       <LEDGERNAME>Basic Salary</LEDGERNAME>
       <ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
       <AMOUNT>-1000.00</AMOUNT>
       <VATEXPAMOUNT>-1000.00</VATEXPAMOUNT>
       <CATEGORYALLOCATIONS.LIST>
        <CATEGORY>Primary Cost Category</CATEGORY>
        <COSTCENTREALLOCATIONS.LIST>
         <NAME>Shoeb</NAME>
         <AMOUNT>-1000.00</AMOUNT>
        </COSTCENTREALLOCATIONS.LIST>
       </CATEGORYALLOCATIONS.LIST>
      </ALLLEDGERENTRIES.LIST>

      <ALLLEDGERENTRIES.LIST>
       <LEDGERNAME>Salary Payable</LEDGERNAME>
       <ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
       <AMOUNT>1000.00</AMOUNT>
       <VATEXPAMOUNT>1000.00</VATEXPAMOUNT>
      </ALLLEDGERENTRIES.LIST>


     </VOUCHER>
    </TALLYMESSAGE>
   </REQUESTDATA>
  </IMPORTDATA>
 </BODY>
</ENVELOPE>

Как мне изменить мойкод для достижения этого?

Любые предложения приветствуются.Благодаря.

1 Ответ

3 голосов
/ 11 июня 2019
data1 = '''<ENVELOPE>
 <HEADER>
  <TALLYREQUEST>Import Data</TALLYREQUEST>
 </HEADER>
 <BODY>
  <IMPORTDATA>
   <REQUESTDESC>
    <REPORTNAME>Vouchers</REPORTNAME>
    <STATICVARIABLES>
     <SVCURRENTCOMPANY>SOAC</SVCURRENTCOMPANY>
    </STATICVARIABLES>
   </REQUESTDESC>
   <REQUESTDATA>
    <TALLYMESSAGE xmlns:UDF="TallyUDF">
     <VOUCHER VCHTYPE="Journal" ACTION="Create" OBJVIEW="Accounting Voucher View">

     </VOUCHER>
    </TALLYMESSAGE>
   </REQUESTDATA>
  </IMPORTDATA>
 </BODY>
</ENVELOPE>'''


data2 = '''<DATE>20190101</DATE>
      <VOUCHERTYPENAME>Journal</VOUCHERTYPENAME>
      <VOUCHERNUMBER>5</VOUCHERNUMBER>
      <PERSISTEDVIEW>Accounting Voucher View</PERSISTEDVIEW>
      <EFFECTIVEDATE>20190101</EFFECTIVEDATE>

      <MASTERID> 1</MASTERID>

      <ALLLEDGERENTRIES.LIST>
       <LEDGERNAME>Basic Salary</LEDGERNAME>
       <ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
       <AMOUNT>-1000.00</AMOUNT>
       <VATEXPAMOUNT>-1000.00</VATEXPAMOUNT>
       <CATEGORYALLOCATIONS.LIST>
        <CATEGORY>Primary Cost Category</CATEGORY>
        <COSTCENTREALLOCATIONS.LIST>
         <NAME>Shoeb</NAME>
         <AMOUNT>-1000.00</AMOUNT>
        </COSTCENTREALLOCATIONS.LIST>
       </CATEGORYALLOCATIONS.LIST>
      </ALLLEDGERENTRIES.LIST>

      <ALLLEDGERENTRIES.LIST>
       <LEDGERNAME>Salary Payable</LEDGERNAME>
       <ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
       <AMOUNT>1000.00</AMOUNT>
       <VATEXPAMOUNT>1000.00</VATEXPAMOUNT>
      </ALLLEDGERENTRIES.LIST>'''

from bs4 import BeautifulSoup

soup1 = BeautifulSoup(data1, 'xml')
soup2 = BeautifulSoup(data2, 'lxml')
body = soup2.select_one('body')
soup1.select_one('VOUCHER[VCHTYPE="Journal"]').append(body)
body.unwrap()

print(soup1.prettify())

Отпечатки:

<?xml version="1.0" encoding="utf-8"?>
<ENVELOPE>
 <HEADER>
  <TALLYREQUEST>
   Import Data
  </TALLYREQUEST>
 </HEADER>
 <BODY>
  <IMPORTDATA>
   <REQUESTDESC>
    <REPORTNAME>
     Vouchers
    </REPORTNAME>
    <STATICVARIABLES>
     <SVCURRENTCOMPANY>
      SOAC
     </SVCURRENTCOMPANY>
    </STATICVARIABLES>
   </REQUESTDESC>
   <REQUESTDATA>
    <TALLYMESSAGE xmlns:UDF="TallyUDF">
     <VOUCHER ACTION="Create" OBJVIEW="Accounting Voucher View" VCHTYPE="Journal">
      <date>
       20190101
      </date>
      <vouchertypename>
       Journal
      </vouchertypename>
      <vouchernumber>
       5
      </vouchernumber>
      <persistedview>
       Accounting Voucher View
      </persistedview>
      <effectivedate>
       20190101
      </effectivedate>
      <masterid>
       1
      </masterid>
      <allledgerentries.list>
       <ledgername>
        Basic Salary
       </ledgername>
       <isdeemedpositive>
        Yes
       </isdeemedpositive>
       <amount>
        -1000.00
       </amount>
       <vatexpamount>
        -1000.00
       </vatexpamount>
       <categoryallocations.list>
        <category>
         Primary Cost Category
        </category>
        <costcentreallocations.list>
         <name>
          Shoeb
         </name>
         <amount>
          -1000.00
         </amount>
        </costcentreallocations.list>
       </categoryallocations.list>
      </allledgerentries.list>
      <allledgerentries.list>
       <ledgername>
        Salary Payable
       </ledgername>
       <isdeemedpositive>
        No
       </isdeemedpositive>
       <amount>
        1000.00
       </amount>
       <vatexpamount>
        1000.00
       </vatexpamount>
      </allledgerentries.list>
     </VOUCHER>
    </TALLYMESSAGE>
   </REQUESTDATA>
  </IMPORTDATA>
 </BODY>
</ENVELOPE>

Версия 2 - для сохранения XML-строки в верхнем регистре (data1, data2 такие же, как и предыдущие):

from bs4 import BeautifulSoup

soup1 = BeautifulSoup(data1, 'xml')
soup2 = BeautifulSoup('<HELPERTAG>' + data2 + '</HELPERTAG>', 'xml')
body = soup2.select_one('HELPERTAG')
soup1.select_one('VOUCHER[VCHTYPE="Journal"]').append(body)
body.unwrap()

print(soup1.prettify())

Отпечатки:

<?xml version="1.0" encoding="utf-8"?>
<ENVELOPE>
 <HEADER>
  <TALLYREQUEST>
   Import Data
  </TALLYREQUEST>
 </HEADER>
 <BODY>
  <IMPORTDATA>
   <REQUESTDESC>
    <REPORTNAME>
     Vouchers
    </REPORTNAME>
    <STATICVARIABLES>
     <SVCURRENTCOMPANY>
      SOAC
     </SVCURRENTCOMPANY>
    </STATICVARIABLES>
   </REQUESTDESC>
   <REQUESTDATA>
    <TALLYMESSAGE xmlns:UDF="TallyUDF">
     <VOUCHER ACTION="Create" OBJVIEW="Accounting Voucher View" VCHTYPE="Journal">
      <DATE>
       20190101
      </DATE>
      <VOUCHERTYPENAME>
       Journal
      </VOUCHERTYPENAME>
      <VOUCHERNUMBER>
       5
      </VOUCHERNUMBER>
      <PERSISTEDVIEW>
       Accounting Voucher View
      </PERSISTEDVIEW>
      <EFFECTIVEDATE>
       20190101
      </EFFECTIVEDATE>
      <MASTERID>
       1
      </MASTERID>
      <ALLLEDGERENTRIES.LIST>
       <LEDGERNAME>
        Basic Salary
       </LEDGERNAME>
       <ISDEEMEDPOSITIVE>
        Yes
       </ISDEEMEDPOSITIVE>
       <AMOUNT>
        -1000.00
       </AMOUNT>
       <VATEXPAMOUNT>
        -1000.00
       </VATEXPAMOUNT>
       <CATEGORYALLOCATIONS.LIST>
        <CATEGORY>
         Primary Cost Category
        </CATEGORY>
        <COSTCENTREALLOCATIONS.LIST>
         <NAME>
          Shoeb
         </NAME>
         <AMOUNT>
          -1000.00
         </AMOUNT>
        </COSTCENTREALLOCATIONS.LIST>
       </CATEGORYALLOCATIONS.LIST>
      </ALLLEDGERENTRIES.LIST>
      <ALLLEDGERENTRIES.LIST>
       <LEDGERNAME>
        Salary Payable
       </LEDGERNAME>
       <ISDEEMEDPOSITIVE>
        No
       </ISDEEMEDPOSITIVE>
       <AMOUNT>
        1000.00
       </AMOUNT>
       <VATEXPAMOUNT>
        1000.00
       </VATEXPAMOUNT>
      </ALLLEDGERENTRIES.LIST>
     </VOUCHER>
    </TALLYMESSAGE>
   </REQUESTDATA>
  </IMPORTDATA>
 </BODY>
</ENVELOPE>
...