在美丽汤标签中插入 XML 树字符串



>我有一个xml树作为字符串。我想将这棵树插入到美丽汤对象内的另一个标签中。

我想将字符串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:UsersAdministratorDesktopTallyJVXml.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>

如何修改我的代码来实现这一点?

任何建议表示赞赏。谢谢。

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 字符串(data1data2与以前的相同(:

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>

最新更新