2013-03-21 133 views
2

我將在前言中指出我在Windows 7上使用Python 2.7.3(x64),並使用lxml 2.3.6。lxml在xml中添加urlencoding?

我有一點奇怪的問題,我希望有人可以幫忙。我沒有在網上找到解決方案,也許我不是在尋找正確的東西。

無論如何,我有一個問題,我用lxml編程構建一些XML,然後輸出到一個文本文件,問題是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 2013-03-21 14:12:17

+0

請參閱http://www.w3.org/TR/xml/#sec-line-ends – 2013-03-21 14:30:45

+0

@isdev我使用的索引器恰好以「rb」模式打開文件,所以我一直在尋找一種解決方案在那裏不需要改變。我確定索引是可能的非二進制模式,但我希望不能去那裏。 – Raceyman 2013-03-21 16:14:51

回答

0

Windows使用\r\n表示一行結束,Unix使用\n。 這將刪除行尾的\r(如果有的話)(因此代碼也可以與unix文本文件一起使用。)它將刪除至多一個\r,因此如果在該行的其他位置有一個\r它將被保存。

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 2013-03-21 16:11:24