#python #xml
#python #xml
Вопрос:
Кто-нибудь видит проблему, почему я получаю следующее исключение
Произошло исключение: неизвестное свойство ParserError MyConnection:nodeName
в этом примере кода xsdata?
from dataclasses import dataclass, field
from typing import List
from xsdata.formats.dataclass.parsers import XmlParser
from xsdata.formats.dataclass.parsers.config import ParserConfig
xml = """
<?xml version="1.0"?>
<LineList>
<Line>
<ConnectionList>
<Connection>
<NodeName>ABC</NodeName>
</Connection>
<Connection>
<NodeName>DEF</NodeName>
</Connection>
</ConnectionList>
</Line>
</LineList>
"""
@dataclass
class MyConnection:
node_name: str = field(metadata=dict(name="NodeName"))
@dataclass
class MyConnectionList:
connections: List[MyConnection] = field(default_factory=list, metadata=dict(name="Connection"))
@dataclass
class MyLine:
connection_list: MyConnectionList = field(metadata=dict(name="ConnectionList"))
@dataclass
class MyLineList:
class Meta:
name = "LineList"
lines: List[MyLine] = field(default_factory=list, metadata=dict(name="Line"))
config = ParserConfig(fail_on_unknown_properties=True)
parser = XmlParser(config=config)
obj = parser.from_string(xml, MyLineList)
Я понятия не имею, что происходит не так!
С уважением, Дэниел.
Комментарии:
1. что такое
xsdata
?
Ответ №1:
Обновите поле MyConnection.node_name, чтобы включить тип xml, контекст модели предполагает, что ваше поле является узлом текстового значения, поскольку класс имеет только одно примитивное поле. Лучше быть явным.
@dataclass
class MyConnection:
node_name: str = field(metadata=dict(name="NodeName", type="Element"))
Кроме того, xsdata поставляется с генератором кода, который вы также можете использовать для сопоставления образцов xml с моделями или, по крайней мере, для начала
- xsdata генерирует sample.xml
- xsdata генерирует samples_dir/
Учитывая ваш образец, он сгенерирует для вас следующее
from dataclasses import dataclass, field
from typing import List, Optional
@dataclass
class Connection:
node_name: Optional[str] = field(
default=None,
metadata={
"name": "NodeName",
"type": "Element",
}
)
@dataclass
class ConnectionList:
connection: List[Connection] = field(
default_factory=list,
metadata={
"name": "Connection",
"type": "Element",
}
)
@dataclass
class Line:
connection_list: Optional[ConnectionList] = field(
default=None,
metadata={
"name": "ConnectionList",
"type": "Element",
}
)
@dataclass
class LineList:
line: Optional[Line] = field(
default=None,
metadata={
"name": "Line",
"type": "Element",
}
)