2016-03-29 25 views
0

Bir xml dosyasındaki belirli düğümler içindeki değerleri değiştirmenin 2 yolunu denedim ve çalışmıyor.python ile xml değerlerini değiştirin

Benim Dosya:

<?xml version="1.0" encoding="UTF-8"?> 
 
<OrdSet xmlns="tfs" xmlns:xsi="http://www.sample.org/XMLSchema-instance" xsi:schemaLocation="tfs tfs.xsd" Version="25"> 
 
    <Msg> 
 
     <MsgCreate> 
 
      <Date>20160324</Date> 
 
      <Time>111057</Time> 
 
      <Src> 
 
       <SrcType>D</SrcType> 
 
       <DlrCode>0001</DlrCode> 
 
      </Src> 
 
      <Target> 
 
       <TargetType>F</TargetType> 
 
       <MgmtCode>BTG</MgmtCode> 
 
      </Target> 
 
     </MsgCreate> 
 
     <MsgType> 
 
      <OrdReq> 
 
       <ActnCode>NEW</ActnCode> 
 
       <SrcID>64698602107101</SrcID> 
 
       <RepCode>0000</RepCode> 
 
       <OrdDtl> 
 
        <AcctLookup> 
 
         <MgmtCode>ABC</MgmtCode> 
 
         <FundAcctID>984575</FundAcctID> 
 
         <AcctDesig>2</AcctDesig> 
 
        </AcctLookup> 
 
        <TrxnDtl> 
 
         <Buy> 
 
          <TrxnTyp>5</TrxnTyp> 
 
          <FundID>205</FundID> 
 
          <Amt> 
 
           <AmtType>D</AmtType> 
 
           <AmtValue>600.00</AmtValue> 
 
          </Amt> 
 
         </Buy> 
 
        </TrxnDtl> 
 
       </OrdDtl> 
 
      </OrdReq> 
 
     </MsgType> 
 
    </Msg> 
 
omitted ...

Amacım YENİ dan CAN ActnCode değerini değiştirmektir.

I.e., <ActnCode>CAN</ActnCode>

Denemesi # 1: Senaryo iyi çalışır ancak değerler çıktı dosyasında hâlâ "YENİ" dir. Hiçbir şey değişmemiş gibi görünüyor.

import xml.etree.ElementTree as ET 
 
tree = ET.parse("~\input.xml") 
 
root = tree.getroot() 
 
elems = tree.findall('ActnCode') 
 
for elem in elems: 
 
\t elem.txt = 'CAN' 
 
tree.write("~\output.xml")

Girişimi # 2: Senaryo düzgün yanı çalışır ama amaçlandığı gibi işe yaramıyor.

xmldoc = minidom.parse('~input.xml') 
 
action_code = xmldoc.getElementsByTagName('ActnCode') 
 
firstchild = action_code[0] 
 
firstchild.setAttribute('ActnCode', 'CAN') 
 

 
result: 
 
<ActnCode ActnCode="CAN">NEW</ActnCode>

Sonuçta, ben piton, xml doc bakmak tüm ActnCode düğümleri bulmak ve değerleri için "CAN" değiştirmek istiyorum. Herhangi bir yardım takdir edilecektir.

+0

arasında OrdDtl/AcctLookup/FundAcctID sınırlar. Bir XSLT dönüşümü çalıştırmak için etree yerine *** lxml *** kullanabilir misiniz? –

cevap

0

Bazı sorunlarınız var. Aradığınız öğenin, <OrdSet xmlns="..."'daki varsayılan ad alanından miras kalan ve bulmaya dahil edilmesi gereken bir ad alanı vardır. Daha sonra, findall sadece ElementTree'nin "psödo-xsl" alt ağacı arama desenini eklemediğiniz sürece çocuklara bakar. Son olarak, txt değil, text özniteliğini değiştirmeniz gerekir.

<?xml version="1.0" encoding="UTF-8"?> 
<OrdSet xmlns="tfs"> 
    <Msg> 
     <MsgCreate> 
      <ActnCode>NEW</ActnCode> 
      <SrcID>64698602107101</SrcID> 
      <RepCode>0000</RepCode> 
      <OrdDtl> 
       <AcctLookup> 
        <MgmtCode>ABC</MgmtCode> 
        <FundAcctID>984575</FundAcctID> 
        <AcctDesig>2</AcctDesig> 
       </AcctLookup> 
      </OrdDtl> 
     </MsgCreate> 
    </Msg> 
</OrdSet> 

test için

Kısaltılmış XML ... Ve kod

import xml.etree.ElementTree as ET 
tree = ET.parse("input.xml") 
root = tree.getroot() 
elems = tree.findall('.//{http://abc}ActnCode') 
print('elems', elems) 
for elem in elems: 
    elem.text = 'CAN' 
tree.write("output.xml") 

DÜZENLEME

Sen ElementTree ile daha lxml ile daha karmaşık XPATH sorgular yapabilir hale gelir. Hangi <ActnCode> öğelerini işleyeceğinizi sınırlamak isterseniz, bu öneri, seçimi iyileştirmek için diğer öğelere bakar. Köşeli parantez içindeki nesneler aslında eşleşmeyen düğümleri kaldıracak bir filtredir. Burada bir kardeş ile düğümlere Bu XSLT'de önemsiz 984575

import lxml.etree 
tree = lxml.etree.parse('input.xml') 
elems = tree.xpath('//tfs:ActnCode[../tfs:OrdDtl/tfs:AcctLookup/tfs:FundAcctID/text()="984575"]', 
    namespaces={'tfs':'tfs'}) 
elems2 = tree.xpath('.//tfs:ActnCode[../tfs:OrdDtl]', 
    namespaces={'tfs':'tfs'}) 
print('elems', elems) 
for elem in elems: 
    elem.text = 'CAN' 
tree.write("output.xml") 
+0

Mükemmel çalışıyor. Teşekkürler! – spiderlily

+0

Başka bir soruna rastlıyorum. Kodu, yalnızca ActAcctID yalnızca 984575 ise ActnCode'u 'CAN' olarak değiştirecek şekilde nasıl değiştirebilirim? – spiderlily

+0

Arama ifadesine yüklemeler ekleyebilirsiniz, ancak ElemenTree'nin destek desteği sınırlıdır. Lxml ve XPATH yüklemlerini kullanan başka bir örnek vereceğim. – tdelaney

İlgili konular