Уплотнение xml с Python

То, что вы хотите сделать, это загрузить тему как часть вашего метода main. Затем вы можете передать загруженную тему в ваши AppState конструкторы. Не то чтобы я добавил async в ваш метод main и перенес настройку theme в вашем AppState в параметры.

void main() async {

  var theme = await getActiveTheme();

  final store = Store<AppState>(
    reducer,
    initialState: AppState.initialState(theme),
  );

  runApp(MyApp(store: store));
}

class AppState {

  // ...

  AppState.initialState(this.theme)
      : user = null;
}
5
задан Sergey Golovchenko 20 March 2009 в 19:22
поделиться

4 ответа

Довольно простой с BeautifulSoup.

Это решение предполагает, что нормально разделять пробел от заключительных частей символьных данных.
Пример: <foo> bar </foo> становится <foo>bar</foo>

Это правильно проигнорирует комментарии и CDATA.

import BeautifulSoup

s = """
<node1>
    <node2>
        <node3>foo</node3>
    </node2>
    <node3>
      <!-- I'm a comment! Leave me be! -->
    </node3>
    <node4>
    <![CDATA[
      I'm CDATA!  Changing me would be bad!
    ]]>
    </node4>
</node1>
"""

soup = BeautifulSoup.BeautifulStoneSoup(s)

for t in soup.findAll(text=True):
   if type(t) is BeautifulSoup.NavigableString: # Ignores comments and CDATA
      t.replaceWith(t.strip())

print soup
4
ответ дан 18 December 2019 в 08:31
поделиться

Это довольно легко обрабатывается с lxml (примечание: эта конкретная функция не находится в ElementTree):

from lxml import etree

parser = etree.XMLParser(remove_blank_text=True)

foo = """<node1>
    <node2>
        <node3>foo  </node3>
    </node2>
</node1>"""

bar = etree.XML(foo, parser)
print etree.tostring(bar,pretty_print=False,with_tail=True)

Результаты в:

<node1><node2><node3>foo  </node3></node2></node1>

Править: Ответ Триптихом напомнил мне о требованиях CDATA, таким образом, строка, создающая объект синтаксического анализатора, должна на самом деле быть похожей на это:

parser = etree.XMLParser(remove_blank_text=True, strip_cdata=False)
8
ответ дан 18 December 2019 в 08:31
поделиться

Я использовал бы XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="*">
        <xsl:copy>
            <xsl:copy-of select="@*" />
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Это должно добиться цели.

В Python Вы могли использовать lxml (прямая ссылка на образец на домашней странице) для преобразования его.

Для некоторых тестов использовать xsltproc, образец:

xsltproc test.xsl  test.xml

где test.xsl файл выше и test.xml Ваш XML-файл.

5
ответ дан 18 December 2019 в 08:31
поделиться

Не решение действительно, но так как Вы попросили рекомендации: я отговорил бы от выполнения Вашего собственного парсинга (если Вы не хотите изучить, как записать сложный синтаксический анализатор), потому что, как Вы говорите, не, все пробелы должны быть удалены. Нет только блоков CDATA, но также и элементов с атрибутом "xml:space=preserve", которые соответствуют вещам как <pre> в XHTML (где вложенные пробелы на самом деле имеют значение), и запись синтаксического анализатора, который может распознать, те элементы и оставлять пробел в покое были бы возможны, но неприятны.

Я пошел бы с методом парсинга, т.е. загрузил бы документ и пошел бы узел узлом, распечатывающий их. Тем путем можно легко определить, из каких узлов можно разделить пробелы и который Вы не можете. В библиотеке стандарта Python существуют некоторые модули, ни одна из которой я когда-либо использовал ;-) который мог быть полезен для Вас..., пробуют xml.dom, или я не уверен, могли ли Вы сделать это с xml.parsers.expat.

2
ответ дан 18 December 2019 в 08:31
поделиться
Другие вопросы по тегам:

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