У меня есть xml документ, который выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="CoreNLP-to-HTML.xsl" type="text/xsl"?>
<root>
<document>
<docId>CVE-2002-2131.txt</docId>
<sentences>
<sentence id="1">
<tokens>
<token id="1">
<word>Directory</word>
<lemma>Directory</lemma>
<CharacterOffsetBegin>0</CharacterOffsetBegin>
<CharacterOffsetEnd>9</CharacterOffsetEnd>
<POS>NNP</POS>
</token>
<token id="2">
<word>traversal</word>
<lemma>traversal</lemma>
<CharacterOffsetBegin>10</CharacterOffsetBegin>
<CharacterOffsetEnd>19</CharacterOffsetEnd>
<POS>NN</POS>
</token>
<token id="3">
<word>vulnerability</word>
<lemma>vulnerability</lemma>
<CharacterOffsetBegin>20</CharacterOffsetBegin>
<CharacterOffsetEnd>33</CharacterOffsetEnd>
<POS>NN</POS>
</token>
<token id="4">
<word>in</word>
<lemma>in</lemma>
<CharacterOffsetBegin>34</CharacterOffsetBegin>
<CharacterOffsetEnd>36</CharacterOffsetEnd>
<POS>IN</POS>
</token>
...
По какой-то причине, когда я пытаюсь перебрать xml и напечатать дочерний тег и атрибут, он печатает документ {} .
Это мой код:
print("-------")
#extract from xml file and get fields ready for csv for this document
newFilePathOneXml=os.path.join("ners",filenameWithoutExtension,'CVE-2002-2131.txt.xml')
print(newFilePathOneXml)
from xml.etree import ElementTree as et
tree = et.parse(newFilePathOneXml)
print("here2")
root = tree.getroot()
print("here3")
for child in root:
print("here4")
print (child.tag, child.attrib)
print("here5")
#f = open(newFilePathOneXml,"r")
#print(f.read())
et.dump(myRoot)
Вот что печатается:
---
ners\nvdcve-1.1-2002\CVE-2002-2131.txt.xml
here2
here3
here4
document {}
here5
...........prints xml document here................
Я пытаюсь следовать инструкциям по этой ссылке на получить xml и получить доступ с дочерними тегами . Все, что мне действительно нужно, - это теги word в каждом элементе токена. Я собираюсь получить значения слов и записать в строку.
Есть идеи, почему это не работает? Имя файла: cve-2002-2131.txt. xml.
Обновление: я добавил чтение файла и распечатал содержимое файла, а затем попробовал et.dump (мой Root), и он распечатал все xml таким образом, как это было сделано для чтения файла и печати (f.read ()).
Update2: я получил это на работу, но я не уверен, что лучший способ получить токен Значения элемента:.
for elem in tree.iter():
print (elem)
печать:
here3
<Element 'root' at 0x000002588AF2A5E8>
here4
here5
<Element 'document' at 0x000002588AF2A548>
here4
here5
<Element 'docId' at 0x000002588AF2AB88>
here4
here5
<Element 'sentences' at 0x000002588AF89638>
here4
here5
<Element 'sentence' at 0x000002588AF89688>
here4
here5
<Element 'tokens' at 0x000002588AF89CC8>
here4
here5
<Element 'token' at 0x0000025884CFAC28>
...
Я смотрю итерации по дереву , и есть ответ о tree.findall, но это делать странные вещи.
tokens=tree.findall('.//tokens')
print(tokens)
#for token in range(len(tokens)) #this gives error
# print(token)
печатает:
[<Element 'tokens' at 0x00000222B2059CC8>, <Element 'tokens' at 0x00000222ABDF7958>, <Element 'tokens' at 0x00000222ABDFE318>]