python печатает документ {} при попытке выполнить итерацию по xml и распечатать теги и атрибуты - PullRequest
0 голосов
/ 12 января 2020

У меня есть 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>]

1 Ответ

0 голосов
/ 12 января 2020

Я нашел решение для этого:

print("here3")
tokens=tree.findall('.//tokens')
#print(tokens)
for tokensItem in tokens: #range(len(tokens))
    for token in tokensItem:
        print(token.find('word').text)

Хотя может быть более эффективный способ, поэтому не стесняйтесь делиться.

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