如何在XML文件中的CDATA前后添加空格。

问题描述 投票:0回答:1

我想创建一个函数来修改XML内容而不改变格式。我设法改变了文本,但我不能在不改变XML格式的情况下做到这一点.所以现在,我想做的是在XML文件中的CDATA之前和之后添加空间。

默认的XML文件。

<?xml version="1.0" encoding="utf-8"?>
<Mapsxmlns="http://www.semi.org">
  <Map>
    <Device>
      <ReferenceDevice/>
      <Bin>
        <Bin Bin="001"/>
      </Bin>
      <Data>
        <Row> <![CDATA[001 001 001]]> </Row>
      </Data>
    </Device>
  </Map>
</Maps>

我得到了这个结果。

<?xml version="1.0" encoding="utf-8"?>
<Mapsxmlns="http://www.semi.org">
  <Map>
    <Device>
      <ReferenceDevice/>
      <Bin>
        <Bin Bin="001"/>
      </Bin>
      <Data>
        <Row><![CDATA[001 001 099]]></Row>
      </Data>
    </Device>
  </Map>
</Maps>

然而,我希望新的xml是这样的。

<?xml version="1.0" encoding="utf-8"?>
<Mapsxmlns="http://www.semi.org">
  <Map>
    <Device>
      <ReferenceDevice/>
      <Bin>
        <Bin Bin="001"/>
      </Bin>
      <Data>
        <Row> <![CDATA[001 001 099]]> </Row>
      </Data>
    </Device>
  </Map>
</Maps>

这是我的代码

from lxml import etree as ET

def xml_new(f,fpath,newtext,xmlrow):
    xmlrow = 19
    parser = ET.XMLParser(strip_cdata=False)
    tree = ET.parse(f, parser)
    root = tree.getroot()
    for child in root:
       value = child[0][2][xmlrow].text

    text = ET.CDATA("001 001 099")
    child[0][2][xmlrow] = ET.Element('Row')
    child[0][2][xmlrow].text = text
    child[0][2][xmlrow].tail = "\n"
    ET.register_namespace('A', "http://www.semi.org")
    tree.write(fpath,encoding='utf-8',xml_declaration=True)
    return value

有谁能帮帮我吗?

python xml lxml cdata
1个回答
0
投票

我不太明白你想做什么。这里有一个例子给你。我不知道它是否能满足你的需求。

from simplified_scrapy import SimplifiedDoc,req,utils
html ='''<?xml version="1.0" encoding="utf-8"?>
<Mapsxmlns="http://www.semi.org">
  <Map>
    <Device>
      <ReferenceDevice/>
      <Bin>
        <Bin Bin="001"/>
      </Bin>
      <Data>
        <Row> <![CDATA[001 001 001]]> </Row>
      </Data>
    </Device>
  </Map>
</Maps>'''
doc = SimplifiedDoc(html)
row = doc.Data.Row # Get the node you want to modify.
row.setContent(" "+row.html+" ") # Modify the node content.
print (doc.html)

结果。

<?xml version="1.0" encoding="utf-8"?>
<Mapsxmlns="http://www.semi.org">
  <Map>
    <Device>
      <ReferenceDevice />
      <Bin>
        <Bin Bin="001" />
      </Bin>
      <Data>
        <Row>  <![CDATA[001 001 001]]>  </Row>
      </Data>
    </Device>
  </Map>
</Maps>

0
投票

谢谢你的帮助 我已经找到了另一种方法来实现我想要的结果。

这是代码。

# what you want to change
replaceby = '020]]> </Row>\n'
# row you want to change
row = 1
# col you want to change based on list
col = 3
file = open(file,'r')
line = file.readlines()
i = 0
editedXML=[]
for l in line:
    if 'cdata' in l.lower():
        i=i+1
        if i == row:
            oldVal = l.split(' ')
            newVal = []
            for index, old in enumerate(oldVal):
                if index == col:
                    newVal.append(replaceby)
                else:
                    newVal.append(old)
            editedXML.append(' '.join(newVal))
        else:
            editedXML.append(l)
    else:
        editedXML.append(l)
file2 = open(newfile,'w')
file2.write(''.join(editedXML))
file2.close()
© www.soinside.com 2019 - 2024. All rights reserved.