1. ホーム
  2. python-3.x

[解決済み] xml.parsers.expat.ExpatError: 整形式でない(無効なトークン)。

2022-02-19 21:57:24

質問

xmltodictを使って下記のxmlファイルを読み込むと、エラーが発生します。 xml.parsers.expat.ExpatError: 整形式でない(無効なトークン): 1行目、1列目

以下は私のファイルです。

<?xml version="1.0" encoding="utf-8"?>
<mydocument has="an attribute">
  <and>
    <many>elements</many>
    <many>more elements</many>
  </and>
  <plus a="complex">
    element as well
  </plus>
</mydocument>

出典

import xmltodict
with open('fileTEST.xml') as fd:
   xmltodict.parse(fd.read())

私はWindows 10で、Python 3.6とxmltodict 0.11.0を使用しています。

ElementTreeを使用すると動作します。

tree = ET.ElementTree(file='fileTEST.xml')
    for elem in tree.iter():
            print(elem.tag, elem.attrib)

mydocument {'has': 'an attribute'}
and {}
many {}
many {}
plus {'a': 'complex'}

注:改行の問題に遭遇したのかもしれません。
注2: 2つの異なるファイルでBeyond Compareを使用しました。
UTF-8 BOMエンコードされたファイルではクラッシュし、UTF-8ファイルでは動作します。
UTF-8 BOMは、読者がUTF-8でエンコードされたファイルであることを識別するためのバイト列(EF BB BF)である。

どのように解決するのですか?

エンコーディングの種類を定義し忘れているのではないでしょうか。 そのxmlファイルを文字列変数に初期化することをお勧めします。

import xml.etree.ElementTree as ET
import xmltodict
import json


tree = ET.parse('your_data.xml')
xml_data = tree.getroot()
#here you can change the encoding type to be able to set it to the one you need
xmlstr = ET.tostring(xml_data, encoding='utf-8', method='xml')

data_dict = dict(xmltodict.parse(xmlstr))