То, что вы хотите сделать, это загрузить тему как часть вашего метода 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;
}
Довольно простой с 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
Это довольно легко обрабатывается с 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)
Я использовал бы 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-файл.
Не решение действительно, но так как Вы попросили рекомендации: я отговорил бы от выполнения Вашего собственного парсинга (если Вы не хотите изучить, как записать сложный синтаксический анализатор), потому что, как Вы говорите, не, все пробелы должны быть удалены. Нет только блоков CDATA, но также и элементов с атрибутом "xml:space=preserve", которые соответствуют вещам как <pre>
в XHTML (где вложенные пробелы на самом деле имеют значение), и запись синтаксического анализатора, который может распознать, те элементы и оставлять пробел в покое были бы возможны, но неприятны.
Я пошел бы с методом парсинга, т.е. загрузил бы документ и пошел бы узел узлом, распечатывающий их. Тем путем можно легко определить, из каких узлов можно разделить пробелы и который Вы не можете. В библиотеке стандарта Python существуют некоторые модули, ни одна из которой я когда-либо использовал ;-) который мог быть полезен для Вас..., пробуют xml.dom
, или я не уверен, могли ли Вы сделать это с xml.parsers.expat
.