【问题标题】:insert xml tree string in beautifulsoup tag在beautifulsoup标签中插入xml树字符串
【发布时间】:2019-10-25 19:03:55
【问题描述】:

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

我想在标签<voucher action="Create" objview="Accounting Voucher View" vchtype="Journal"> 中插入字符串stra。

在原始文件中,凭证标签内没有任何内容。

代码:

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>

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

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

【问题讨论】:

    标签: python xml python-3.x beautifulsoup python-3.6


    【解决方案1】:
    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>
    

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 2021-12-25
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      相关资源
      最近更新 更多