1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
import enum
from dataclasses import dataclass
from typing import Dict, List, Optional
from xsdata.models.enums import DataType
from xsdata.utils.namespaces import build_qname
class DtdElementType(enum.Enum):
UNDEFINED = "undefined"
EMPTY = "empty"
ANY = "any"
MIXED = "mixed"
ELEMENT = "element"
class DtdAttributeDefault(enum.Enum):
REQUIRED = "required"
IMPLIED = "implied"
FIXED = "fixed"
NONE = "none"
class DtdAttributeType(enum.Enum):
CDATA = "cdata"
ID = "id"
IDREF = "idref"
IDREFS = "idrefs"
ENTITY = "entity"
ENTITIES = "entities"
NMTOKEN = "nmtoken"
NMTOKENS = "nmtokens"
ENUMERATION = "enumeration"
NOTATION = "notation"
class DtdContentType(enum.Enum):
PCDATA = "pcdata"
ELEMENT = "element"
SEQ = "seq"
OR = "or"
class DtdContentOccur(enum.Enum):
ONCE = "once"
OPT = "opt"
MULT = "mult"
PLUS = "plus"
@dataclass
class DtdAttribute:
name: str
prefix: Optional[str]
type: DtdAttributeType
default: DtdAttributeDefault
default_value: Optional[str]
values: List[str]
@property
def data_type(self) -> DataType:
return DataType.from_code(self.type.value.lower())
@dataclass
class DtdContent:
name: str
type: DtdContentType
occur: DtdContentOccur
left: Optional["DtdContent"]
right: Optional["DtdContent"]
@dataclass
class DtdElement:
name: str
type: DtdElementType
prefix: Optional[str]
content: Optional[DtdContent]
attributes: List[DtdAttribute]
ns_map: Dict
@property
def qname(self) -> str:
namespace = self.ns_map.get(self.prefix)
return build_qname(namespace, self.name)
@dataclass
class Dtd:
location: str
elements: List[DtdElement]
|