Перенос слов в содержимое узла xml с помощью lxml - PullRequest
0 голосов
/ 29 мая 2019

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

На данный момент я попытался, как показано ниже:

from lxml import etree


def lines_lenght(string, width):
    words = string.split()
    for i in range(0, len(words), width):
        yield " ".join(words[i:i+width])

s = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in enim at arcu tincidunt tristique. Ut commodo dui hendrerit lobortis egestas. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed laoreet interdum enim ut cursus. Fusce condimentum dictum dictum. Morbi feugiat bibendum enim, ut mollis turpis tincidunt vitae. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce libero ante, consectetur at sollicitudin at, eleifend lacinia ipsum. In hac habitasse platea dictumst. Sed laoreet mi eu nisi condimentum, sit amet vestibulum purus elementum. Nam a eros mi. 
"""


root = etree.Element("corpus")

doc = etree.ElementTree(root)

article_node = etree.SubElement(root, "article")

final_content = "\n".join(lines_lenght(s, 10))
article_node.text = final_content

doc.write("corpus.xml", xml_declaration=True, encoding="utf-8")

Но в сгенерированном файле XML разрывы строк делаютне похоже на сохранность.Согласно этому ответу Я пытался использовать 
 вместо \ n, но результат тот же.

Любой намек, чтобы помочь мне?

Редактировать: Вотпредварительный просмотр того, чего я пытаюсь достичь:

<corpus>  
<article>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in  
enim at arcu tincidunt tristique. Ut commodo dui hendrerit lobortis  
egestas. Orci varius natoque penatibus et magnis dis parturient   montes</article>  
</corpus>  

Вместо:

<corpus>
<article>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in enim at arcu tincidunt tristique. Ut commodo dui hendrerit lobortis egestas. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</article>
</corpus>

1 Ответ

0 голосов
/ 29 мая 2019

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

Is запускается как у вас, но останавливается сразу после article_node.text = final_content (до doc.write()).И добавляет из ответа, связанного выше:

def indent(elem, level=0):
i = "\n" + level*"  "
if len(elem):
    #print(len(elem))
    if not elem.text or not elem.text.strip():
        elem.text = i + "  "
    if not elem.tail or not elem.tail.strip():
        elem.tail = i
    for elem in elem:
        indent(elem, level+1)
    if not elem.tail or not elem.tail.strip():
        elem.tail = i

else:
    if level and (not elem.tail or not elem.tail.strip()):
        elem.tail = i

Затем на:

import xml.etree.ElementTree as ET
root2 = ET.fromstring(etree.tostring(doc))
tree = ET.ElementTree(root2)

indent(root2)
tree.write("corpus.xml", encoding="utf-8", xml_declaration=True)

Чтобы проверить это:

with open("corpus.xml") as f:
    print(f.read())

Вывод:

<?xml version='1.0' encoding='utf-8'?>
<corpus>
  <article>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in
enim at arcu tincidunt tristique. Ut commodo dui hendrerit lobortis
egestas. Orci varius natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Sed laoreet interdum enim ut cursus. Fusce
condimentum dictum dictum. Morbi feugiat bibendum enim, ut mollis turpis
tincidunt vitae. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Fusce libero ante, consectetur at sollicitudin at, eleifend lacinia ipsum.
In hac habitasse platea dictumst. Sed laoreet mi eu nisi
condimentum, sit amet vestibulum purus elementum. Nam a eros mi.</article>
</corpus>

Те, кто более знаком с библиотекой xml, могут сделать это короче, но это лучшее, что я мог сделать ...

...