Замените несколько текстов соответствующими текстами в XML, используя Python - PullRequest
3 голосов
/ 03 ноября 2011

Как я могу заменить японские тексты соответствующими английскими текстами? У меня есть сотни AliasName, которые мне нужно заменить. Поскольку я новичок в Python и XML, пошаговая инструкция будет принята с благодарностью.

Вот как выглядит мой xml-файл:

<Workspace>
    <Dataset>
        <DataElement>
            <Name>POP</Name>
            <Fields>
                <Field>
                    <Name>State</Name>
                    <AliasName>?</AliasName>  # replace to  <AliasName>State</AliasName>
                </Field>
                <Field>
                    <Name>City</Name>
                    <AliasName>??</AliasName>  # replace to <AliasName>City</AliasName>
                </Field>
            (...)

Вот как далеко я зашел. Я создал словарь, надеясь, что смогу использовать его для замены (?)

>>> x = ("State", "州", "City", "都市", "Town", "町")
>>> dic = dict(x[n:n+2] for n in xrange(0, len(x), 2))
>>> print dic   # Japanese appears strange in python GUI
{'Town': '\x92\xac', 'City':'\x93s\x8es', 'State': '\x8fB'}

Мне также удалось выделить и отобразить все японские тексты в диапазоне <AliasName></AliasName>.

from xml.dom import minidom
xdoc = minidom.parse(r"D:\Desktop\python\src\sample.xml")
workspace = xdoc.getElementsByTagName("AliasName")
for i, element in enumerate(workspace):
    print (i, element.childNodes[0].data)

Сюда я застрял. Как я могу заменить и сохранить обновления на xml?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011
  1. Использовать строки Unicode.Определите кодировку источника в верхней части модуля.
  2. Вы можете использовать ElementTree вместо minidom.У него более приятный API.

Пример

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import xml.etree.cElementTree as etree

en2jp = {u"State": u"州", u"City": u"都市", u"Town": u"町"} # English -> Japanese

tree = etree.parse(filename)
for field in tree.iterfind('.//Fields/Field'):
    name, alias = [field.find(tag) for tag in ['Name', 'AliasName']]
    if name is None or name.text is None or alias is None: continue
    alias.text = en2jp.get(name.text.strip(), alias.text)
tree.write('output.xml', encoding='utf-8')

Вам не нужен словарь, чтобы установить текст <AliasName> равным тексту тега <Name> изтот же <Field>:

#!/usr/bin/env python
import xml.etree.cElementTree as etree

tree = etree.parse("input.xml")
for field in tree.iterfind('.//Fields/FieldArray/Field'):
    name, alias = [field.find(tag) for tag in ['Name', 'AliasName']]
    if name is None or alias is None: 
       continue # skip if either <Name> or <AliasName> are not found
    alias.text = name.text # set <AliasName> text to be the same as <Name>

tree.write('output.xml', encoding='utf-8')
0 голосов
/ 03 ноября 2011

как насчет использования функции string.replace ()?

string.replace (str, old, new [, maxreplace]) Возвращает копию строки str, в которой все вхождения подстроки old заменяются новыми.Если указан необязательный аргумент maxreplace, заменяются первые вхождения maxreplace.

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