2010-12-28 3 views
1

У меня есть документ XML, который выглядит следующим образом:Заменить строки и теги XML с «»

<file> 
    <name>NAME_OF_FILE</name> 
    </file> 
    <file> 
    <name>NAME_OF_FILE</name> 
    </file> 

Я пытаюсь написать скрипт на Python, который заменит все символы новой строки, теги и пропуски между тегами (т. Е. Не сами элементы) с ','.

Выход для указанного выше файла должно выглядеть следующим образом:

NAME_OF_FILE','NAME_OF_FILE','NAME_OF_FILE',' 

Вот что я получил до сих пор. У меня трудности с пониманием, как именно Python обрабатывает переводы строк:

import sys 
import os 
import re 

source = r'c:\A\grepper.txt' 

f = open(source,'r') 
out = open(r'c:\A\bout.txt', 'a') 

for line in f: 
    one = re.sub(r"\n", '', line) 
    two = re.sub(r"\r", '', one) 
    three = re.sub(r'</name>.*<name>', '\',\'', two) 
    out.write(three) 

out.close() 

ответ

2

Удалите r с, как они цитируют строку буквально.

one = re.sub("\n", '', line) 
two = re.sub("\r", '', one) 

Вы также можете использовать string.replace() для этих простых замен, а также объединить их в одну линию.

line = re.sub('r</name>.*<name>', "','", line.replace('\n', '').replace('\r', '')) 
out.write(line) 

Однако, это еще не решило проблему получения желаемого результата. Я бы предложил делать следующее за что:

results = [] 
for line in f: 
    match = re.search(r'<name>(.*)</name>', line) 
    if match: 
     results.append(match.group(1)) 
print >>out, "','".join(results) 

Вот это работает: http://ideone.com/ik48G

+0

удивительным. Просто небольшая опечатка: «,». Join должно быть «», «». Join. +1 за усилие. – Ramy

+0

@ Ramy Fixed (15 символов) – marcog

0

Вместо того, чтобы заменить вас, возможно, захотите рассмотреть вопрос соответствия, что вы хотите:

tag_re = re.compile(''' 
    <(?P<tag>[a-z]+)> # First match the tag, must be a-z enclosed in <> 
    (?P<value>[^<>]+) # Match the value, anything but <> 
    </(?P=tag)> # Match the same tag we got earlier, but the closing version 
''', re.VERBOSE) 
print "','".join(m.group('value') for m in tag_re.finditer(data)) 
0

Регулярные выражения неправильны для этого. Используйте модуль xml.sax.handler.

Непроверенные:

import xml.sax 
from xml.sax.handler import ContentHandler 

class CharactersOnlyContentHandler(ContentHandler): 
    def __init__(self): 
     ContentHandler.__init__(self) 
     self.text = "" 
     self.texts = [] 

    def characters(self, content): 
     self.text += content 

    def endElement(self, name): 
     if self.text: 
      self.texts.append(self.text) 
      self.text = "" 

handler = CharactersOnlyContentHandler() 
xml.sax.parse(xml_file_name, handler) 
print ",".join("'%s'" % s for s in handler.texts) 
0
import lxml.etree 

myxml = """ 
<filelist> 
    <file> 
     <name>FIRST FILE NAME</name> 
    </file> 
    <file> 
     <name>SECOND FILE NAME</name> 
    </file> 
</filelist> 
""" 

root = lxml.etree.fromstring(myxml) 
filenames = root.xpath('//file/name/text()') 
print ', '.join(filenames) 

приводит

FIRST FILE NAME, SECOND FILE NAME 
Смежные вопросы