Что не так с моим кодом xsdata на Python? (Неизвестное свойство ParserError)

#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",
        }
    )