XML, анализирующий с lxml и Python

Помогите мне разрешить свою проблему с lxml
(Я - новичок к lxml).
Как может я получать "Комментарий 1" из следующего файла:

<?xml version="1.0" encoding="windows-1251" standalone="yes" ?>
<!--Comment 1-->
<a>
   <!--Comment 2-->
</a>
6
задан 14 January 2010 в 09:49
поделиться

2 ответа

>>> from lxml import etree
>>> tree = etree.parse('filename.xml')
>>> root = tree.getroot()
>>> print root.getprevious()
<!--Comment 1-->

или, чтобы быть уверенным (там может быть более одного):

>>> for i in root.itersiblings(tag=etree.Comment, preceding=True):
...     print i
...
<!--Comment 1-->

Используйте атрибут .Text . Если вы хотите извлечь текст комментария.

6
ответ дан 8 December 2019 в 12:59
поделиться

По моему опыту, это не так просто. Встроенный клиент PHP SOAP не работает с SOAP-сервером на базе .NET. Он пожаловался на недопустимое определение схемы. Несмотря на то, что клиент .NET работал с этим сервером нормально. Кстати, позвольте мне утверждать, что совместимость SOAP - это миф.

Следующим шагом был NuSOAP . Это сработало довольно долго. Кстати, ради Бога, не забудьте кэшировать WSDL! Но даже при кэшировании WSDL пользователи жаловались, что чертовски медленно.

Затем мы решили открыть HTTP, собрав запросы и прочитав ответы с помощью SimpleXMLElemnt , вот так:

$request_info = array();

$full_response = @http_post_data(
    'http://example.com/OTA_WS.asmx',
    $REQUEST_BODY,
    array(
        'headers' => array(
            'Content-Type' => 'text/xml; charset=UTF-8',
            'SOAPAction'   => 'HotelAvail',
        ),
        'timeout' => 60,

    ),
    $request_info
);

$response_xml = new SimpleXMLElement(strstr($full_response, '<?xml'));

foreach ($response_xml->xpath('//@HotelName') as $HotelName) {
    echo strval($HotelName) . "\n";
}

Обратите внимание, что в PHP 5,2 вам понадобится pecl_http, насколько (сюрприз-сюрприз!) нет встроенного HTTP-клиента.

Когда мы открываем HTTP, количество просить SOAP превысило 30%. И с этого момента мы перенаправляем все жалобы производительности на серверных парней.

В конце концов, я бы рекомендовал этот последний подход, а не из-за производительности. Я думаю, что в общем, в динамическом языке, таком как PHP, нет никакой выгоды от всего этого WSDL/type-control. Вам не нужна модная библиотека для чтения и записи XML, со всем, что блокирует генерацию и динамические прокси. Ваш язык уже динамичен, и SimpleXMLElement работает просто и просто. Кроме того, у вас будет меньше кода , что всегда хорошо.

-121--1075855-

Здесь имеется действительно хорошее учебное пособие , в котором описывается, как использовать BufferStrategy для создания непереносимой анимации.

Важные точки:

  • Вызовите setIgnireRepaint (true) на холсте верхнего уровня Canvas , чтобы предотвратить перекраску AWT, так как обычно вы делаете это сами в цикле анимации.
  • Получите объект Graphics2D из BufferStrategy (вместо использования экземпляра, переданного через paintComponent (Graphics g) .
-121--4294040-

Документы: учебник lxml и поиск «Comments»

Code:

import lxml.etree as et

text = """\
<?xml version="1.0" encoding="windows-1251" standalone="yes" ?>
<!--Comment 1a-->
<!--Comment 1b-->
<a> waffle
   <!--Comment 2-->
   blah blah
</a>
<!--Comment 3a-->
<!--Comment 3b-->
"""
print "\n=== %s ===" % et.__name__
root = et.fromstring(text)

for pre in (True, False):
    for comment in root.itersiblings(tag=et.Comment, preceding=pre):
        print pre, comment

for elem in root.iter():
    print
    print isinstance(elem.tag, basestring), elem.__class__.__name__, repr(elem.tag), repr(elem.text), repr(elem.tail)

Output:

=== lxml.etree ===
True <!--Comment 1b-->
True <!--Comment 1a-->
False <!--Comment 3a-->
False <!--Comment 3b-->

True _Element 'a' ' waffle\n   ' None

False _Comment <built-in function Comment> 'Comment 2' '\n   blah blah\n'

Comments: не работает с xml.etree.cEleyTree

12
ответ дан 8 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

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