2013-03-21 2 views
2

Я предваряю это, указав, что я использую Python 2.7.3 (x64) для Windows 7 с lxml 2.3.6.lxml добавляет urlencoding в xml?

У меня есть небольшая, странная проблема. Я надеюсь, что кто-то может помочь. Я не нашел решение в Интернете, возможно, я не искал правильные вещи.

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

К примеру, у меня есть простой текстовый файл, созданный в блокноте, как это:

This 
is 
my 
text 

Я тогда построить некоторые XML и добавить этот текст в XML:

from lxml import etree 

textstr = "" 
fh = open("mytext.txt", "rb") 
for line in fh: 
    textstr += line 

root = etree.Element("root") 
a = etree.SubElement(root, "some_element") 
a.text = textstr 

print etree.tostring(root) 

Проблема здесь вывод вывода выглядит следующим образом:

<root><some_element>This&#13; 
is&#13; 
my&#13; 
text</some_element></root> 

Для моих целей разрывы строк в порядке, но t он &#13; элементов нет.

Что мне удалось выяснить, так это то, что это происходит, потому что я открываю текстовый файл в двоичном режиме "rb" (который мне действительно нужно делать, когда мое приложение индексирует большой текстовый файл). Если я не открываю файл в двоичном режиме "r", то вывод не содержит &#13; (но, конечно, тогда мое индексирование не работает).

Я также попытался изменить etree.tostring к:

print etree.tostring(root, method="xml") 

Однако нет никакой разницы в результатах.

Теперь я могу выгрузить XML-текст в строку, а затем заменить артефакты $#13;, однако я надеялся на более элегантное решение - потому что текстовые файлы, которые я разбираю, не под моим контролем, и я опасается, что другие элементы текстового файла могут быть преобразованы в кодировку стиля URL без моего ведома.

Кто-нибудь знает способ предотвращения этой кодировки?

+2

Что вы подразумеваете под «мое индексирование не работает». В вашем посте нет никаких доказательств. Возможно, решение состоит в том, чтобы исправить индексирование и открыть файл в текстовом режиме ... сложно сказать без дополнительной информации. – isedev

+0

См. Http://www.w3.org/TR/xml/#sec-line-ends –

+0

@isdev Индексатор, который я использую, открывает файл в режиме «rb», поэтому я искал решение, которое не требовали изменений там. Я уверен, что индексирование возможно в не двоичном режиме, но я надеялся, что туда не поеду. – Raceyman

ответ

0

Windows использует \r\n, чтобы представить окончание строки, Unix использует \n. Это приведет к удалению \r в конце строки, если там есть (так что код будет работать и с текстовыми файлами unix тоже.) Он удалит не более одного \r, поэтому, если есть \r10 где-то еще в строке он будет сохранен.

import re 
textstr = "" 
with open("mytext.txt", "rb") as fh: 
    for line in fh: 
     textstr += re.sub(r'\r$', '', line) 
print(repr(textstr)) 
+0

Я никогда не буду использовать файлы стиля unix, но это работает для меня! Благодаря! – Raceyman

Смежные вопросы