Как получить доступ к тексту в XML, содержащем пространство имен, используя python ElementTree - PullRequest
0 голосов
/ 24 марта 2020

У меня есть простой XML с пространствами имен. Я не могу получить доступ к тексту внутри пространства имен. XML выглядит следующим образом:

    <?xml version="1.0" encoding="UTF-8"?>
<!-- Created by IRIS Business Services Limited -->
<link:linkbase xmlns:xsi="http://www.ffff.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.uhtj.org/2006/ref http://www.frsfs.org/2006/ref-2006-02-27.xsd http://www.ghi.org/in-ghi-rep-par ../core/in-ghi-rep-par.xsd http://www.rl.org/2003/linkbase http://www.rl.org/2003/rl-linkbase-2003-12-31.xsd" xmlns:in-ghi-rep-par="http://www.ghi.org/in-ghi-rep-par" xmlns:link="http://www.rl.org/2003/linkbase" xmlns:ref="http://www.rl.org/2006/ref" xmlns:rli="http://www.rl.org/2003/instance" xmlns:xlink="http://www.ffff.org/1999/xlink">
  <link:referenceLink xlink:type="extended" xlink:role="http://www.rl.org/2003/role/link">
    <link:loc xlink:type="locator" xlink:href="../core/in-ghi-rep.xsd#in-ghi-rep_ReportingPeriodTable" xlink:label="in-ghi-rep_ReportingPeriodTable"/>
    <link:reference xlink:type="resource" xlink:label="res_1" xlink:role="http://www.rl.org/2003/role/disclosureRef" id="res_1">
      <in-ghi-rep-par:Circular>DBS.No.FBC.BC.34/13.12.001/99-2000  dt April 6, 2000</in-ghi-rep-par:Circular>
    </link:reference>
  </link:referenceLink>
</link:linkbase>

Все, что я хочу сделать, это получить "DBS.No.FBC.BC.34/13.12.001/99-2000 dt April 6, 2000", что является значением Циркуляр.

Мой текущий код выглядит следующим образом. Я исследовал ElementTree, но все еще не смог найти решение.

from lxml import etree

tree = etree.parse("s2.xml")
root = tree.getroot()
root2.nsmap
for Circular in root.findall('{http://www.ghi.org/in-ghi-rep-par}'):
    print (Circular.text)

Я новичок в разборе XML. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 24 марта 2020

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

print(root[0][1].findall('{http://www.ghi.org/in-ghi-rep-par}*'))
print(root[0][1].findall('{http://www.ghi.org/in-ghi-rep-par}Circular'))

Но при условии, что вы не знаете где тег может находиться в xml, тогда вы можете выполнить поиск по root и использовать .//, чтобы сообщить своему спрессированному xpath, что нужно искать его во всех элементах рекурсивно из этого элемента. Опять же, вам нужно указать подстановочный знак для имени тега или фактического имени тега.

print(root.findall('.//{http://www.ghi.org/in-ghi-rep-par}*'))
print(root.findall('.//{http://www.ghi.org/in-ghi-rep-par}Circular'))

Например:

print(root.findall('.//{http://www.ghi.org/in-ghi-rep-par}Circular')[0].text)

ВЫХОД

DBS.No.FBC.BC.34/13.12.001/99-2000  dt April 6, 2000
...