2013-08-12 4 views
-1

Мне нужно получить некоторую информацию после определенного тега в lxml. XML-документ выглядит следующим образомparse xml с lxml, включая пространство имен

<?xml version="1.0" encoding="ISO-8859-1"?> 
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ 
ns/j2ee/web-app_2_4.xsd" 
    version="2.4"> 
    <display-name>Community Bank</display-name> 
    <description>WebGoat for Cigital</description> 

     <context-param> 
       <param-name>PropertiesPath</param-name> 
<param-value>/WEB-INF/properties.txt</param-value> 
       <description>This is the path to the properties file from the servlet root</description> 
     </context-param> 

    <servlet> 
     <servlet-name>Index</servlet-name> 
<servlet-class>com.cigital.boi.servlet.index</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Index</servlet-name> 
     <url-pattern>/index</url-pattern> 
    </servlet-mapping> 

    <servlet-mapping> 
     <servlet-name>Index</servlet-name> 
     <url-pattern>/index.html</url-pattern> 
    </servlet-mapping> 

Я хочу читать com.cigital.boi.servlet.index.

Я использовал этот код, чтобы прочитать все под сервлет

context = etree.parse(handle) 
    list = parser.xpath('//servlet') 
    print list 

список не содержит ничего больше информации: итерацию поля контекста я нашел эти строки.

<Element {http://java.sun.com/xml/ns/j2ee}servlet-name at 2ad19e6eca48> 
<Element {http://java.sun.com/xml/ns/j2ee}servlet-class at 2ad19e6ecaf8> 

Я думаю, что я не включал пространство имен во время поиска, вывод пустого списка. пожалуйста, предложите мотыгу прочитать "com.cigital.boi.servlet.index" в сервлет класса тега

ответ

4

Попробуйте следующее:

from lxml import etree 
context = etree.parse(handle) 
print next(x.text for x in context.xpath('.//*[local-name()="servlet-class"]')) 

Альтернатива:

from lxml import etree 
context = etree.parse(handle) 
nsmap = context.getroot().nsmap.copy() 
nsmap['xmlns'] = nsmap.pop(None) 
print next(x.text for x in context.xpath('.//xmlns:servlet-class', namespaces=nsmap)) 
+0

Это работало ... спасибо – kbang

+0

HI @Falsetru, мне было интересно, есть ли способ разбора элементов, когда в документе содержится более 1 пространства имен. дайте мне знать .. спасибо – kbang

+0

@KiranBangalore, первый код в моем ответе обработает это. – falsetru