[email protected] writes:
> On Monday, April 25, 2016 at 12:47:14 PM UTC+5:30, Jussi Piitulainen wrote:
>> [email protected] writes:
>>
>> > Hi Jussi,
>> >
>> > i have seen you have written a definition to fulfill the requirement,
>> > can we do this same thing using xml parser, as i have failed to
>> > implement the thing using xml parser of python if the file is having
>> > the content as below...
>> >
>> > <!DOCTYPE web-app
>> > PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
>> > "http://java.sun.com/dtd/web-app_2_3.dtd">
>> >
>> > <web-app>
>> >
>> > and entire thing works if it has as below:
>> > <!DOCTYPE web-app
>> > <web-app>
>> >
>> > what i observe is xml tree parsing is not working if http tags are
>> > there in between web-app...
>>
>> Do you get an error message?
>>
>> My guess is that the parser needs the DTD but cannot access it. There
>> appears to be a DTD at that address, http://java.sun.com/... (it
>> redirects to Oracle, who bought Sun a while ago), but something might
>> prevent the parser from accessing it by default. If so, the details
>> depend on what parser you are trying to use. It may be possible to save
>> that DTD as a local file and point the parser to that.
>>
>> Your problem is morphing rather wildly. A previous version had namespace
>> declarations but no DTD or XSD if I remember right. The initial version
>> wasn't XML at all.
>>
>> If you post (1) an actual, minimal document, (2) the actual Python
>> commands that fail to parse it, and (3) the error message you get,
>> someone will be able to help you. The content of the document need not
>> be more than "hello, world" level. The DOCTYPE declaration and the
>> outermost tags with all their attributes and namespace declarations, if
>> any, are important.
>
> Hi Jussi,
>
> Here is an input file...sample.xml
>
> <?xml version="1.0" encoding="ISO-8859-1"?>
> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
> http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
> version="3.1">
> <servlet>
> <servlet-name>controller</servlet-name>
> <servlet-class>com.mycompany.mypackage.ControllerServlet</servlet-class>
> <init-param>
> <param-name>listOrders</param-name>
> <param-value>com.mycompany.myactions.ListOrdersAction</param-value>
> </init-param>
> <init-param>
> <param-name>saveCustomer</param-name>
> <param-value>com.mycompany.myactions.SaveCustomerAction</param-value>
> </init-param>
> <load-on-startup>5</load-on-startup>
> </servlet>
>
>
> <servlet-mapping>
> <servlet-name>graph</servlet-name>
> <url-pattern>/graph</url-pattern>
> </servlet-mapping>
>
>
> <session-config>
> <session-timeout>30</session-timeout>
> </session-config>
> </web-app>
>
> --------------------------------
> Here is the code:
>
> import xml.etree.ElementTree as ET
> ET.register_namespace("", "http://xmlns.jcp.org/xml/ns/javaee")
> tree = ET.parse('sample.xml')
> root = tree.getroot()
>
> for servlet in root.findall('servlet'):
> servletname = servlet.find('servlet-name').text
> if servletname == "controller":
> root.remove(servlet)
>
> tree.write('output.xml')
>
> This will work if <web-app> </web-app> doesnt have below...
>
> xmlns="http://xmlns.jcp.org/xml/ns/javaee"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
> http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
It's a namespace issue, and your method of registering a default
namespace isn't working. It's a frustrating failure mode: no error
message, no nothing :)
Try defining a namespace prefix in your method calls, and using that
prefix in element names:
ns = { 'x' : "http://xmlns.jcp.org/xml/ns/javaee" }
for servlet in root.findall('x:servlet', ns):
servletname = servlet.find('x:servlet-name', ns).text
I got this from here:
https://docs.python.org/3/library/xml.etree.elementtree.html#parsing-xml-with-namespaces
Note that the namespace prefix - I chose to use 'x' - has no meaning.
It's the association of the prefix that you use to the URI that is the
name of the namespace that does the job.
--
https://mail.python.org/mailman/listinfo/python-list