Запись данных в xml в python [duplicate]

Мы должны будем инициализировать Firebase в функции onCreate класса Application.

 package com.rocks.music.videoplayer;

 import android.app.Application;
 import android.content.Context;

 import com.google.firebase.FirebaseApp;


/**
* Created by ashish123 on 22/8/15.
  */
 public class MyApplication extends Application {

private static MyApplication mInstance;

@Override
public void onCreate() {
    super.onCreate();
    mInstance = this;
    try {
        FirebaseApp.initializeApp(this);
    }
    catch (Exception e) {
    }
}

public static Context getInstance() {
    return mInstance;
}

}

Код в файле манифеста: -

  <application
    android:name="com.rocks.music.videoplayer.MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/app_icon"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
114
задан Blankman 31 August 2010 в 03:38
поделиться

6 ответов

В наши дни самым популярным (и очень простым) вариантом является ElementTree API , который был включен в стандартную библиотеку с Python 2.5.

Доступные опции для которые являются:

  • ElementTree (базовая, реализация на чистом Python ElementTree. Часть стандартной библиотеки с 2,5)
  • cElementTree (оптимизированная реализация C ElementTree. стандартная библиотека с 2.5)
  • LXML (на основе libxml2. Предлагает богатый надмножество API ElementTree, а также XPath, CSS Selectors и т. д.)

Вот пример того, как сгенерировать ваш примерный документ с помощью in-stdlib cElementTree:

import xml.etree.cElementTree as ET

root = ET.Element("root")
doc = ET.SubElement(root, "doc")

ET.SubElement(doc, "field1", name="blah").text = "some value1"
ET.SubElement(doc, "field2", name="asdfasd").text = "some vlaue2"

tree = ET.ElementTree(root)
tree.write("filename.xml")

Я протестировал его, и он работает, но я предполагаю, что пробелы не значимы. Если вам нужен отпечаток «prettyprint», дайте мне знать, и я посмотрю, как это сделать. (Это может быть специфичный для LXML вариант. Я не использую реализацию stdlib много)

Для дальнейшего чтения здесь приведены некоторые полезные ссылки:

Как последнее замечание, либо cElementTree, либо LXML должны быть достаточно быстрыми для всех ваших потребностей (оба оптимизированы C-кодом ), но в случае, когда вы находитесь в ситуации, когда вам нужно выжать каждый последний бит производительности, тесты на сайте LXML показывают, что:

  • LXML явно выигрывает для сериализации (генерации ) XML
  • Как побочный эффект реализации правильного обхода родителя, LXML немного медленнее, чем cElementTree для синтаксического анализа.
206
ответ дан ssokolow 20 August 2018 в 15:40
поделиться
  • 1
    Я получаю import xml.etree.cElementTree as ET, ImportError: No module named etree.cElementTree - стандартный OSX 10.8 python, но как-то он работает, когда я запускаю его изнутри ipython. – guaka 26 December 2013 в 21:10
  • 2
    @Kasper: У меня нет Mac, поэтому я не могу попытаться дублировать проблему. Скажите мне версию Python, и я посмотрю, смогу ли я ее воспроизвести в Linux. – ssokolow 3 January 2014 в 22:31
  • 3
    @ssokolow, я сейчас на OSX 10.9, и это как-то было разрешено, я не помню, было ли это мое собственное действие или я сделал что-то, чтобы его разрешить. – guaka 4 January 2014 в 20:34
  • 4
    @nonsensickle Вы действительно должны были задать новый вопрос, а затем послали мне ссылку на него, чтобы все могли извлечь из этого пользу. Однако я укажу вам в правильном направлении. Библиотеки DOM (Document Object Model) всегда создают модель в памяти, поэтому вместо этого вы хотите реализовать SAX (Simple API для XML). Я никогда не смотрел реализации SAX, но вот учебник для использования in-stdlib one для вывода, а не для ввода. – ssokolow 29 May 2014 в 19:40
  • 5
    @YonatanSimson Я не знаю, как добавить эту строку exact , поскольку ElementTree, похоже, подчиняется только xml_declaration=True, если вы указываете кодировку ... но чтобы получить эквивалентное поведение, вызовите tree.write(), как this: tree.write("filename.xml", xml_declaration=True, encoding='utf-8') Вы можете использовать любую кодировку, если вы явно указываете ее. (ascii заставит все символы Юникода за пределами 7-разрядного набора ASCII быть закодированным сущностью, если вы не доверяете правильному настройке веб-сервера). – ssokolow 22 January 2016 в 04:43

Для такой простой XML-структуры вы можете не захотеть использовать полномасштабный XML-модуль. Рассмотрим шаблон строки для простейших структур, или Jinja для чего-то более сложного. Jinja может обрабатывать переплетение списка данных для создания внутреннего xml вашего списка документов. Это немного сложнее с необработанными шаблонами строк python

. Для примера Jinja см. Мой ответ на аналогичный вопрос .

Вот пример генерации ваш файл xml с строковыми шаблонами.

import string
from xml.sax.saxutils import escape

inner_template = string.Template('    <field${id} name="${name}">${value}</field${id}>')

outer_template = string.Template("""<root>
 <doc>
${document_list}
 </doc>
</root>
 """)

data = [
    (1, 'foo', 'The value for the foo document'),
    (2, 'bar', 'The <value> for the <bar> document'),
]

inner_contents = [inner_template.substitute(id=id, name=name, value=escape(value)) for (id, name, value) in data]
result = outer_template.substitute(document_list='\n'.join(inner_contents))
print result

Выход:

<root>
 <doc>
    <field1 name="foo">The value for the foo document</field1>
    <field2 name="bar">The &lt;value&gt; for the &lt;bar&gt; document</field2>
 </doc>
</root>

Недостатком подхода шаблона является то, что вы не получите escape < и > бесплатно. Я танцевал вокруг этой проблемы, вытаскивая утилиту из xml.sax

1
ответ дан bigh_29 20 August 2018 в 15:40
поделиться

Библиотека lxml включает очень удобный синтаксис для генерации XML, называемый E-factory . Вот как я приведу пример:

#!/usr/bin/python
import lxml.etree
import lxml.builder    

E = lxml.builder.ElementMaker()
ROOT = E.root
DOC = E.doc
FIELD1 = E.field1
FIELD2 = E.field2

the_doc = ROOT(
        DOC(
            FIELD1('some value1', name='blah'),
            FIELD2('some value2', name='asdfasd'),
            )   
        )   

print lxml.etree.tostring(the_doc, pretty_print=True)

Выход:

<root>
  <doc>
    <field1 name="blah">some value1</field1>
    <field2 name="asdfasd">some value2</field2>
  </doc>
</root>

Он также поддерживает добавление к уже созданному узлу, например. после вышесказанного вы можете сказать

the_doc.append(FIELD2('another value again', name='hithere'))
49
ответ дан rescdsk 20 August 2018 в 15:40
поделиться
  • 1
    Если имя тега не соответствует правилам идентификатора Python, вы можете использовать getattr, например, getattr(E, "some-tag"). – haridsv 30 March 2016 в 11:04

Yattag http://www.yattag.org/ или https://github.com/leforestier/yattag предоставляет интересный API для создания такого документа XML ( а также HTML-документы).

Использует ключевое слово context manager и with.

from yattag import Doc, indent

doc, tag, text = Doc().tagtext()

with tag('root'):
    with tag('doc'):
        with tag('field1', name='blah'):
            text('some value1')
        with tag('field2', name='asdfasd'):
            text('some value2')

result = indent(
    doc.getvalue(),
    indentation = ' '*4,
    newline = '\r\n'
)

print(result)

, поэтому вы получите:

<root>
    <doc>
        <field1 name="blah">some value1</field1>
        <field2 name="asdfasd">some value2</field2>
    </doc>
</root>
11
ответ дан scls 20 August 2018 в 15:40
поделиться

Для простейшего выбора я бы пошел с мини-министром: http://docs.python.org/library/xml.dom.minidom.html . Он встроен в стандартную библиотеку python и прост в использовании в простых случаях.

Вот довольно простой учебник: http://www.boddie.org.uk/python/ XML_intro.html

5
ответ дан whaley 20 August 2018 в 15:40
поделиться
  • 1
    Этот ответ должен включать пример использования мини-диска. – Steven Vascellaro 12 February 2018 в 22:07
0
ответ дан Cloughie 31 October 2018 в 11:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: