Я пытаюсь проанализировать XML-файл, используя lxml
.lxml - По умолчанию пространства имен
my_tree = etree.parse(file)
my_root = my_tree.getroot()
for child in my_root:
print(child.tag)
# {some default namespace}Prop
# {some default namespace}Prop
# {some default namespace}Stuff
# ...
В идеале, я просто хочу, чтобы все элементы, которые я хочу что-то вроде
my_root.findall('Prop', my_root.nsmap)
, но это возвращает пустой список. Я заметил, что словарь my_root.nsmap
содержит элемент None с пространством имен по умолчанию.
nsmap = {None: 'default namespace', ...}
Я нашел быстрый обходной путь копирования nsmap и добавление элемента «по умолчанию» с тем же значением, как None пункт, а затем я
my_root.findall('default:Prop', new_map)
Это чувствует себя очень хак. Почему None даже на карте пространства имен? Есть ли простой метод в lxml, который автоматически использует пространство имен по умолчанию?
Изменить: XML Я смотрю на это по линии
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ScenarioProps xmlns="http://filler.com/default.xsd" xmlns:ns2="http://filler.com/ns.xsd" id="Test">
<Prop id="Wi-Fi">
<ns2:Position x="0.0" y="0.0" z="0.0"/>
<ns2:Orientation roll="0.0" pitch="0.0" yaw="0.0"/>
</Prop>
</ScenarioProps>
Пожалуйста, покажите нам источник XML (preferab насколько это возможно, достаточно, чтобы воспроизвести проблему). – mzjn
@mzjn редактируется. Надеюсь, этого достаточно, чтобы быть полезным. – Shatnerz