|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
|
Packit Service |
b74dd5 |
<head>
|
|
Packit Service |
b74dd5 |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
Packit Service |
b74dd5 |
<meta name="generator" content="Docutils 0.12: http://docutils.sourceforge.net/" />
|
|
Packit Service |
b74dd5 |
<title>Document loading and URL resolving</title>
|
|
Packit Service |
b74dd5 |
<link rel="stylesheet" href="style.css" type="text/css" />
|
|
Packit Service |
b74dd5 |
<script type="text/javascript">
|
|
Packit Service |
b74dd5 |
function trigger_menu(event) {
|
|
Packit Service |
b74dd5 |
var sidemenu = document.getElementById("sidemenu");
|
|
Packit Service |
b74dd5 |
var classes = sidemenu.getAttribute("class");
|
|
Packit Service |
b74dd5 |
classes = (classes.indexOf(" visible") === -1) ? classes + " visible" : classes.replace(" visible", "");
|
|
Packit Service |
b74dd5 |
sidemenu.setAttribute("class", classes);
|
|
Packit Service |
b74dd5 |
event.preventDefault();
|
|
Packit Service |
b74dd5 |
event.stopPropagation();
|
|
Packit Service |
b74dd5 |
}
|
|
Packit Service |
b74dd5 |
function hide_menu() {
|
|
Packit Service |
b74dd5 |
var sidemenu = document.getElementById("sidemenu");
|
|
Packit Service |
b74dd5 |
var classes = sidemenu.getAttribute("class");
|
|
Packit Service |
b74dd5 |
if (classes.indexOf(" visible") !== -1) {
|
|
Packit Service |
b74dd5 |
sidemenu.setAttribute("class", classes.replace(" visible", ""));
|
|
Packit Service |
b74dd5 |
}
|
|
Packit Service |
b74dd5 |
}
|
|
Packit Service |
b74dd5 |
</script><meta content="width=device-width, initial-scale=1" name="viewport" /></head>
|
|
Packit Service |
b74dd5 |
<body onclick="hide_menu()">
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
Document loading and URL resolving
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
Contents
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
XML Catalogs
|
|
Packit Service |
b74dd5 |
URI Resolvers
|
|
Packit Service |
b74dd5 |
Document loading in context
|
|
Packit Service |
b74dd5 |
I/O access control in XSLT
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
The normal way to load external entities (such as DTDs) is by using
|
|
Packit Service |
b74dd5 |
XML catalogs. Lxml also has support for user provided document
|
|
Packit Service |
b74dd5 |
loaders in both the parsers and XSL transformations. These so-called
|
|
Packit Service |
b74dd5 |
resolvers are subclasses of the etree.Resolver class.
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
XML Catalogs
|
|
Packit Service |
b74dd5 |
When loading an external entity for a document, e.g. a DTD, the parser
|
|
Packit Service |
b74dd5 |
is normally configured to prevent network access (see the
|
|
Packit Service |
b74dd5 |
<tt class="docutils literal">no_network</tt> parser option). Instead, it will try to load the
|
|
Packit Service |
b74dd5 |
entity from their local file system path or, in the most common case
|
|
Packit Service |
b74dd5 |
that the entity uses a network URL as reference, from a local XML
|
|
Packit Service |
b74dd5 |
catalog.
|
|
Packit Service |
b74dd5 |
XML catalogs are the preferred and agreed-on mechanism to load
|
|
Packit Service |
b74dd5 |
external entities from XML processors. Most tools will use them, so
|
|
Packit Service |
b74dd5 |
it is worth configuring them properly on a system. Many Linux
|
|
Packit Service |
b74dd5 |
installations use them by default, but on other systems they may need
|
|
Packit Service |
b74dd5 |
to get enabled manually. The libxml2 site has some documentation
|
|
Packit Service |
b74dd5 |
on how to set up XML catalogs
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
URI Resolvers
|
|
Packit Service |
b74dd5 |
Here is an example of a custom resolver:
|
|
Packit Service |
b74dd5 |
>>> from lxml import etree
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
>>> class DTDResolver(etree.Resolver):
|
|
Packit Service |
b74dd5 |
... def resolve(self, url, id, context):
|
|
Packit Service |
b74dd5 |
... print("Resolving URL '%s'" % url)
|
|
Packit Service |
b74dd5 |
... return self.resolve_string(
|
|
Packit Service |
b74dd5 |
... '<!ENTITY myentity "[resolved text: %s]">' % url, context)
|