Как я могу разобрать следующий скрипт XML? - PullRequest
0 голосов
/ 17 июня 2019

Я хочу проанализировать следующий XML-файл. Я уже проанализировал некоторые базовые XML-файлы, но проблема здесь в том, что он имеет несколько атрибутов (я имею в виду несколько

<IF caseSensitive="false" field="Placeholder" inputData="PlaceholderiD"...>)

Я пытался использовать функцию .findall, но в документации сказано, что кавычки недопустимы, поэтому я действительно понятия не имею, как решить мою проблему.

Я уже пытался гуглить, но не смог найти на него ответ. я следующий фрагмент, но с кавычками это не будет работать.

 #!/usr/bin/env python3
import xml.etree.ElementTree as ET
tree = ET.parse('SomeFile.xml')
root = tree.getroot()

root.findall("//*[@caseSensitive='"false"']
for child in root:
print (child.tag, child.attrib)

ФАЙЛ XML:

    <Expressions description="Placeholder" name="Placeholder2">
        <Expression AttributeOne="true" name="JustARandomName">
            <AND AttributeOne="true">
                <OR AttributeOne="true">
                    <IF caseSensitive="false" AttributeTwo="true" field="Placeholder3" AttributeOne="true" inputData="JustAInput1" Operator="true" AnotherOperatorWhichIsNotImportant="false">
                        <SArg dateTime="0">*Something*</SArg>
                    </IF>
                </OR>
                <OR AttributeOne="true">
                    <IF caseSensitive="false" AttributeTwo="false" field="Placeholder4" AttributeOne="true" inputData="JustAInput12" Operator="true" AnotherOperatorWhichIsNotImportant="false">
                        <SArg dateTime="0">Test</SArg>
                    </IF>
                    <AND AttributeOne="true">
                        <IF caseSensitive="false" AttributeTwo="false" field="Placeholder25" AttributeOne="true" inputData="JustAInput13" Operator="true" AnotherOperatorWhichIsNotImportant="false">
                            <SArg dateTime="0">10*</SArg>
                        </IF>
                        <IF caseSensitive="false" AttributeTwo="false" field="Placeholder37" AttributeOne="true" inputData="JustAInput1" Operator="EQUAL" AnotherOperatorWhichIsNotImportant="false">
                            <SArg dateTime="0">true</SArg>
                        </IF>
                        <IF caseSensitive="false" AttributeTwo="true" field="fehlerort" AttributeOne="true" inputData="JustAInput1" Operator="true" AnotherOperatorWhichIsNotImportant="false">
                            <SArg dateTime="0">*Test*</SArg>
                        </IF>
                    </AND> 
...  
... 
...

Я пытаюсь напечатать определенные строки с помощью <IF case Sensitive="false" ... Operator="true"... >
и <IF case Sensitive="false" ... Operator="EQUAL"... > но НЕ <IF case Sensitive="false" ... Operator="NOTEQUAL"... > Если возможно, просто поле inputData = "..." Но я думаю, что когда смогу вывести всю строку, я смогу решить это сам.

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Я пытался использовать функцию .findall, но в документации сказано, что кавычки недопустимы

Я думаю, вы ссылаетесь на это в документации синтаксиспример для [@attrib='value']:

Значение не может содержать кавычки.

Это просто говорит, что значение не может содержать кавычки.Кавычки все еще необходимы в XPath для обозначения строки.

Попробуйте ...

for child in root.findall(".//*[@caseSensitive='false']"):
    print(child.tag, child.attrib)

Для второй части вашего вопроса (игнорируя Operator="NOTEQUAL"), я недумаю, что вы можете сделать это с XPath в ElementTree.Поддержка XPath очень ограничена.

Вы можете сделать это с XPath в lxml , хотя ...

from lxml import etree

tree = etree.parse("Bx_N63x_Befundverifikation_Komplett.xml")

for input_data in tree.xpath(".//*[@caseSensitive='false'][not(@Operator='NOTEQUAL')]/@inputData"):
    print(input_data)
0 голосов
/ 17 июня 2019

Не совсем уверен, что вы планируете делать с ними, но если вы хотите выделить их все в свои списки, вы можете сделать это

, например

import xml.etree.ElementTree

e = xml.etree.ElementTree.parse('Bx_N63x_Befundverifikation_Komplett.xml').getroot()

listCaseSensitive = []
listAtt22 = []
listField = []

, не собираясьзапишите их все, но у вас есть идея, тогда вы могли бы сделать

for child in e.iter('IF'):
    listCaseSensitive.append(child.attrib['caseSensitive'])
    listAtt2.append(child.attrib['AttributeTwo'])
    listField.append(child.attrib['field'])

print listCaseSensitive
print listAtt2
print listField

, это напечатает

['false', 'false', 'false', ....] //for Case Sensitive
['false','false','false', ...] //for AttributeTwo
['Placeholder3','Placeholder4','Placeholder25', .....] //for field

и так далее, и так далее, я думаю, у вас есть идея, так что если вы простохотел, чтобы InputData работал бы так же, и вы могли бы извлечь только InputData из каждого тега IF

Если вы ищете что-то другое, просто дайте мне знать и плохо отредактируйте мой ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...