Удалить первую часть XML-файла, не может быть сериализован - PullRequest
0 голосов
/ 15 июня 2019

У меня есть XML-файл, он начинается как:

'''some non ascii character'''
<b:FatturaElettronica xmlns:b="#">
  <FatturaElettronicaHeader>
    <DatiTrasmissione>
      <IdTrasmittente>
        <IdPaese>IT</IdPaese>

мне нужно удалить все, пока

<FatturaElettronicaHeader>

теперь код:

import xml.etree.ElementTree as ET
import xml.etree.ElementTree as ETree
from lxml import etree

parser = etree.XMLParser(encoding='utf-8', recover=True, remove_comments=True, resolve_entities=False)
tree = ETree.parse('test.xml', parser)

root = tree.getroot()

print etree.tostring(root)

и дай мне:

Traceback (most recent call last):
  File "xml2.py", line 14, in <module>
    print etree.tostring(root)
  File "src/lxml/etree.pyx", line 3350, in lxml.etree.tostring
TypeError: Type 'NoneType' cannot be serialized.

без первой части xml-файла.

TY

1 Ответ

0 голосов
/ 17 июня 2019

вы можете использовать функцию find () для поиска первой скобки.

import xml.etree.ElementTree as ET

with open ('...XMLFILE.xml', 'r') as file:
    filestring = file.read()

XML_start = filestring.find('<')
print(XML_start) #gives 31

tree = ET.fromstring(filestring[XML_start:])

for i in tree.iter():
    print(i.tag) #gives {#}FatturaElettronica, FatturaElettronicaHeader, ... 

, но ваш xml-файл также должен быть правильным:

'''some non ascii character'''
<b:FatturaElettronica xmlns:b="#">
  <FatturaElettronicaHeader>
    <DatiTrasmissione>
      <IdTrasmittente>
        <IdPaese>IT</IdPaese>
        </IdTrasmittente>
    </DatiTrasmissione>
</FatturaElettronicaHeader>
</b:FatturaElettronica>
...