Питон |XML |Найти значение тега на основе значений атрибута в xpath - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть XML-файл, например -

<TAG1>
  <TAG2 name = 'a'>
    <TAG3>
      <TAG4 prop = 5>
        <TAG5> Val1 </TAG5>
        <TAG6> Val2 </TAG6>
      </TAG4>
    </TAG3>
  </TAG2>
  <TAG2 name = 'b'>
    <TAG3>
      <TAG4 prop = 8>
        <TAG5> Val3 </TAG5>
        <TAG6> Val4 </TAG6>
      </TAG4>
    </TAG3>
  </TAG2>
</TAG1>

И у меня есть следующий xpath: / TAG1 / TAG2 [@ name = 'a'] / TAG3 / TAG4 [@ prop = 5] / TAG5

Мне нужно получить Val1.Но не может этого сделать.

tree = ET.parse(in_xml_file)
root = tree.getroot()
with open(in_xpath_file, 'r') as xpath_file:
for line in xpath_file:
    #print (root.xpath(line))
    print (root.findall(line, namespaces))

, где in_xml_file - это файл, а in_xpath_file содержит все xpath, для которых я хочу найти значение [по одному в строке].

При использованииметод xpath, я получаю следующую ошибку -

Traceback (последний вызов был последним): файл "xmlParser.py", строка 71, в файле fn_parse_xml_file (xml_file, xpath_file), файл "xmlParser.py", строка 58, в файле fn_parse_xml_file print (root.xpath (line)), файл" src / lxml / etree.pyx ", строка 1589, в файле lxml.etree._Element.xpath (src \ lxml \ etree.c: 61238)«src / lxml / xpath.pxi», строка 307, в lxml.etree.XPathElementEvaluator. call (src \ lxml \ etree.c: 178777) Файл «src / lxml / xpath.pxi», строка227, в> lxml.etree._XPathEvaluatorBase._handle_result (src \ lxml \ etree.c: 177729) lxml.etree.XPathEvalError: неопределенный префикс пространства имен

при использовании метода xpath I с пространствами имен am,получить следующую ошибку -

Traceback (последний вызов был последним): файл "xmlParser.py", строка73, в файле fn_parse_xml_file (xml_file, xpath_file) Файл "xmlParser.py", строка 60, в файле fn_parse_xml_file print (root.xpath (строка, пространства имен))) Файл "src / lxml / etree.pyx", строка 1580, в lx._Element.xpath (src \ lxml \ etree.c: 61145) TypeError: xpath () принимает ровно 1 позиционный аргумент (2 дано)

При использовании метода findall я получаю следующую ошибку-

Traceback (последний вызов был последним): файл "xmlParser.py", строка 73, в файле fn_parse_xml_file (xml_file, xpath_file) Файл "xmlParser.py", строка 61, в файле fn_parse_xml_file print (root).findall (строка, пространства имен)) Файл "src / lxml / etree.pyx", строка 1565, в lxml.etree._Element.findall (src \ lxml \ etree.c: 60834) Файл "src / lxml / _elementpath.py", строка 322, в lxml._elementpath.findall (src \ lxml_elementpath.c: 9892) Файл" src / lxml / _elementpath.py ", строка 300, в lxml._elementpath.iterfind (src \ lxml_elementpath.c: 9:«src / lxml / _elementpath.py», строка 269, в lxml._elementpath._build_path_iterator (src \ lxml_elementpath.c: 8466) SyntaxError: нельзя использовать абсолютный путь к элементу

PS: я пробовал это как с модулями xml, так и с lxml.

Не могли бы вы сообщить, кто яделать неправильно или дайте мне знать, если есть лучший способ сделать это.

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