home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 April / PCWorld_2001-04_cd.bin / Software / TemaCD / webclean / !!!python!!! / PyXML-0.6.3.win32-py2.0.exe / xmldoc / doc / xml-howto.txt < prev    next >
Text File  |  2000-10-07  |  35KB  |  771 lines

  1.  
  2.                               Python/XML HOWTO
  3.      _________________________________________________________________
  4.    
  5.                               Python/XML HOWTO
  6.                                       
  7.                    The Python/XML Special Interest Group
  8.                                       
  9.                              xml-sig@python.org
  10.                        (edited by akuchling@acm.org)
  11.                                       
  12.   Abstract:
  13.   
  14.    XML is the eXtensible Markup Language, a subset of SGML, intended to
  15.    allow the creation and processing of application-specific markup
  16.    languages. Python makes an excellent language for processing XML data.
  17.    This document is a tutorial for the Python/XML package. It assumes
  18.    you're already familiar with the structure and terminology of XML.
  19.    
  20.    This is a draft document; 'XXX' in the text indicates that something
  21.    has to be filled in later, or rewritten, or verified, or something.
  22.    
  23.    #0#
  24.    
  25. Contents
  26.  
  27.      * Contents
  28.      * 1. Introduction to XML
  29.           + 1.1 Related Links
  30.      * 2. Installing the XML Toolkit
  31.           + 2.1 Related Links
  32.      * 3. SAX: The Simple API for XML
  33.           + 3.1 Starting Out
  34.           + 3.2 Error Handling
  35.           + 3.3 Searching Element Content
  36.           + 3.4 Related Links
  37.      * 4. DOM: The Document Object Model
  38.           + 4.1 Getting A DOM Tree
  39.           + 4.2 Manipulating The Tree
  40.           + 4.3 Walking Over The Entire Tree
  41.           + 4.4 Building A Document
  42.           + 4.5 Processing HTML
  43.           + 4.6 Related Links
  44.      * 5. Glossary
  45.        
  46.                             1. Introduction to XML
  47.                                        
  48.    XML, the eXtensible Markup Language, is a simplified dialect of SGML,
  49.    the Standardized General Markup Language. XML is intended to be
  50.    reasonably simple to implement and use, and is already being used for
  51.    specifying markup languages for various new standards: MathML for
  52.    expressing mathematical equations, Synchronized Multimedia Integration
  53.    Language for multimedia presentations, and so forth.
  54.    
  55.    SGML and XML represent a document by tagging the document's various
  56.    components with their function, or meaning. For example, an academic
  57.    paper contains several parts: it has a title, one or more authors, an
  58.    abstract, the actual text of the paper, a list of references, and so
  59.    forth. A markup languge for writing such papers would therefore have
  60.    tags for indicating what the contents of the abstract are, what the
  61.    title is, and so forth. This should not be confused with the physical
  62.    details of how the document is actually printed on paper. The abstract
  63.    might be printed with narrow margins in a smaller font than the rest
  64.    of the document, but the markup usually won't be concerned with
  65.    details such as this; other software will translate from the markup
  66.    language to a typesetting language such as TEX, and will handle the
  67.    details.
  68.    
  69.    A markup language specified using XML looks a lot like HTML; a
  70.    document consists of a single element, which contains sub-elements,
  71.    which can have further sub-elements inside them. Elements are
  72.    indicated by tags in the text. Tags are always inside angle brackets
  73.    < >. There are two forms of elements. An element can contain content
  74.    between opening and closing tags, as in <name>Euryale</name>, which is
  75.    a name element containing the data "Euryale". This content may be text
  76.    data, other XML elements, or a mixture of both. Elements can also be
  77.    empty, in which case they contain nothing, and are represented as a
  78.    single tag ended with a slash, as in <stop/>, which is an empty stop
  79.    element. Unlike HTML, XML element names are case-sensitive; stop and
  80.    Stop are two different element types.
  81.    
  82.    Opening and empty tags can also contain attributes, which specify
  83.    values associated with an element. For example, text such as <name
  84.    lang='greek'>Herakles</name>, the name element has a lang attribute
  85.    which has a value of "greek". This would contrast with <name
  86.    lang='latin'>Hercules</name>, where the attribute's value is "latin".
  87.    
  88.    A given XML language is specified with a Document Type Definition, or
  89.    DTD. The DTD declares the element names that are allowed, and how
  90.    elements can be nested inside each other. The DTD also specifies the
  91.    attributes that can be provided for each element, their default
  92.    values, and if they can be omitted. For example, to take an example
  93.    from HTML, the LI element, representing an entry in a list, can only
  94.    occur inside certain elements which represent lists, such as OL or UL.
  95.    A validating parser can be given a DTD and a document, and verify
  96.    whether a given document is legal according to the DTD's rules, or
  97.    determine that one or more rules have been violated.
  98.    
  99.    Applications that process XML can be classed into two types. The
  100.    simplest class is an application that only handles one particular
  101.    markup language. For example, a chemistry program may only need to
  102.    process Chemical Markup Language, but not MathML. This application can
  103.    therefore be written specifically for a single DTD, and doesn't need
  104.    to be capable of handling multiple markup languages. This type is
  105.    simpler to write, and can easily be implemented with the available
  106.    Python software.
  107.    
  108.    The second type of application is less common, and has to be able to
  109.    handle any markup language you throw at it. An example might be a
  110.    smart XML editor that helps you to write XML that conforms to a
  111.    selected DTD; it might do so by not letting you enter an element where
  112.    it would be illegal, or by suggesting elements that can be placed at
  113.    the current cursor location. Such an application needs to handle any
  114.    possible XML-defined markup, and therefore must be able to obtain a
  115.    data structure embodying the DTD in use. XXX This type of application
  116.    can't currently be implemented in Python without difficulty (XXX but
  117.    wait and see if a DTD module is included...)
  118.    
  119.    For the full details of XML's syntax, the one definitive source is the
  120.    XML 1.0 specification, available on the Web at
  121.    http://www.w3.org/TR/xml-spec.html. However, like all specifications,
  122.    it's quite formal and isn't intended to be a friendly introduction or
  123.    a tutorial. The annotated version of the standard, at
  124.    http://www.xml.com/xml/pub/axml/axmlintro.html, is quite helpful in
  125.    clarifying the specification's intent. There are also various informal
  126.    tutorials and books available to introduce you to XML.
  127.    
  128.    The rest of this HOWTO will assume that you're familiar with the
  129.    relevant terminology. Most section will use XML terms such as element
  130.    and attribute; section 4 on the Document Object Model will assume that
  131.    you've read the relevant Working Draft, and are familiar with things
  132.    like Iterators and Nodes. Section 3 does not require that you have
  133.    experience with the Java SAX implentations.
  134.    
  135. 1.1 Related Links
  136.  
  137.                          2. Installing the XML Toolkit
  138.                                        
  139.    Windows users should get the precompiled version at
  140.    http://sourceforge.net/projects/pyxml; Mac users will use the
  141.    corresponding precompiled version at XXX. Linux users may wish to use
  142.    either the Debian package from XXX, or the RPM from
  143.    http://sourceforge.net/projects/pyxml. To compile from source on a
  144.    Unix platform, simply perform the following steps.
  145.    
  146.    1.
  147.           If you have are using Python 1.5, you need to install the
  148.           distutils first, which are available from
  149.           http://www.python.org/sigs/distutils-sig. Python 1.6 and later
  150.           already includes the distutils, so you can skip this step.
  151.    2.
  152.           Get a copy of the source distribution from
  153.           http://sourceforge.net/projects/pyxml. Unpack it with the
  154.           following command.
  155.           
  156. gzip -dc xml-package.tgz | tar -xvf -
  157.  
  158.    3.
  159.    Run:
  160.    
  161. python setup.py install
  162.  
  163.    To properly execute this operation, a C compiler is required - the
  164.    same that was used to build Python itself. On a Unix system, this
  165.    operation may require superuser permissions. setup.py supports a
  166.    number of different commands and options, invoke setup.py without any
  167.    arguments to obtain help.
  168.    
  169.    If you have difficulty installing this software, send a problem report
  170.    to <xml-sig@python.org> describing the problem, or submit a bug report
  171.    at http://sourceforget.net/projects/pyxml.
  172.    
  173.    There are various demonstration programs in the demo/ directory of the
  174.    source distribution. You may wish to look at them next to get an
  175.    impression of what's possible with the XML tools, and as a source of
  176.    example code.
  177.    
  178. 2.1 Related Links
  179.  
  180.    http://www.python.org/topics/xml/
  181.           This is the starting point for Python-related XML topics; it is
  182.           updated to refer to all software, mailing lists, documentation,
  183.           etc.
  184.           
  185.                         3. SAX: The Simple API for XML
  186.                                        
  187.    The Simple API for XML isn't a standard in the formal sense, but an
  188.    informal specification designed by David Megginson, with input from
  189.    many people on the xml-dev mailing list. SAX defines an event-driven
  190.    interface for parsing XML. To use SAX, you must create Python class
  191.    instances which implement a specified interface, and the parser will
  192.    then call various methods of those objects.
  193.    
  194.    This howto describes version 2 of SAX (also referred to as SAX2).
  195.    Earlier versions of this text did explain SAX1, which is primarily of
  196.    historical interest only.
  197.    
  198.    SAX is most suitable for purposes where you want to read through an
  199.    entire XML document from beginning to end, and perform some
  200.    computation, such as building a data structure representating a
  201.    document, or summarizing information in a document (computing an
  202.    average value of a certain element, for example). It's not very useful
  203.    if you want to modify the document structure in some complicated way
  204.    that involves changing how elements are nested, though it could be
  205.    used if you simply wish to change element contents or attributes. For
  206.    example, you would not want to re-order chapters in a book using SAX,
  207.    but you might want to change the contents of any name elements with
  208.    the attribute lang equal to 'greek' into Greek letters.
  209.    
  210.    One advantage of SAX is speed and simplicity. Let's say you've defined
  211.    a complicated DTD for listing comic books, and you wish to scan
  212.    through your collection and list everything written by Neil Gaiman.
  213.    For this specialized task, there's no need to expend effort examining
  214.    elements for artists and editors and colourists, because they're
  215.    irrelevant to the search. You can therefore write a class instance
  216.    which ignores all elements that aren't writer.
  217.    
  218.    Another advantage is that you don't have the whole document resident
  219.    in memory at any one time, which matters if you are processing really
  220.    huge documents.
  221.    
  222.    SAX defines 4 basic interfaces; an SAX-compliant XML parser can be
  223.    passed any objects that support these interfaces, and will call
  224.    various methods as data is processed. Your task, therefore, is to
  225.    implement those interfaces that are relevant to your application.
  226.    
  227.    The SAX interfaces are:
  228.    
  229.                              Interface  Purpose
  230.                                       
  231.     ContentHandler Called for general document events. This interface is
  232.        the heart of SAX; its methods are called for the start of the
  233.      document, the start and end of elements, and for the characters of
  234.                       data contained inside elements.
  235.                                       
  236.      DTDHandler Called to handle DTD events required for basic parsing.
  237.     This means notation declarations (XML spec section 4.7) and unparsed
  238.                  entity declarations (XML spec section 4).
  239.                                       
  240.     EntityResolver Called to resolve references to external entities. If
  241.    your documents will have no external entity references, you won't need
  242.                         to implement this interface.
  243.                                       
  244.     ErrorHandler Called for error handling. The parser will call methods
  245.            from this interface to report all warnings and errors.
  246.                                       
  247.    Python doesn't support the concept of interfaces, so the interfaces
  248.    listed above are implemented as Python classes. The default method
  249.    implementations are defined to do nothing--the method body is just a
  250.    Python pass statement-so usually you can simply ignore methods that
  251.    aren't relevant to your application.
  252.    
  253.    Pseudo-code for using SAX looks something like this:
  254.    
  255. # Define your specialized handler classes
  256. from xml.sax import Contenthandler, ...
  257. class docHandler(ContentHandler):
  258.     ...
  259.  
  260. # Create an instance of the handler classes
  261. dh = docHandler()
  262.  
  263. # Create an XML parser
  264. parser = ...
  265.  
  266. # Tell the parser to use your handler instance
  267. parser.setContentHandler(dh)
  268.  
  269. # Parse the file; your handler's method will get called
  270. parser.parse(sys.stdin)
  271.  
  272. 3.1 Starting Out
  273.  
  274.    Following the earlier example, let's consider a simple XML format for
  275.    storing information about a comic book collection. Here's a sample
  276.    document for a collection consisting of a single issue:
  277.    
  278. <collection>
  279.   <comic title="Sandman" number='62'>
  280.     <writer>Neil Gaiman</writer>
  281.     <penciller pages='1-9,18-24'>Glyn Dillon</penciller>
  282.     <penciller pages="10-17">Charles Vess</penciller>
  283.   </comic>
  284. </collection>
  285.  
  286.    An XML document must have a single root element; this is the
  287.    "collection" element. It has one child comic element for each issue;
  288.    the book's title and number are given as attributes of the comic
  289.    element, which can have one or more children containing the issue's
  290.    writer and artists. There may be several artists or writers for a
  291.    single issue.
  292.    
  293.    Let's start off with something simple: a document handler named
  294.    FindIssue that reports whether a given issue is in the collection.
  295.    
  296. from xml.sax import saxutils
  297.  
  298. class FindIssue(saxutils.DefaultHandler):
  299.     def __init__(self, title, number):
  300.         self.search_title, self.search_number = title, number
  301.  
  302.    The DefaultHandler class inherits from all four interfaces:
  303.    ContentHandler, DTDHandler, EntityResolver, and ErrorHandler. This is
  304.    what you should use if you want to use one class for everything. When
  305.    you want separate classes for each purpose, or if you want to
  306.    implement only a single interface, you can just subclass each
  307.    interface individually. Neither of the two approaches is always
  308.    ``better'' than the other; their suitability depends on what you're
  309.    trying to do, and on what you prefer.
  310.    
  311.    Since this class is doing a search, an instance needs to know what to
  312.    search for. The desired title and issue number are passed to the
  313.    FindIssue constructor, and stored as part of the instance.
  314.    
  315.    Now let's look at the function which actually does all the work. This
  316.    simple task only requires looking at the attributes of a given
  317.    element, so only the startElement method is relevant.
  318.    
  319.     def startElement(self, name, attrs):
  320.         # If it's not a comic element, ignore it
  321.         if name != 'comic': return
  322.  
  323.         # Look for the title and number attributes (see text)
  324.         title = attrs.get('title', None)
  325.         number = attrs.get('number', None)
  326.         if title == self.search_title and number == self.search_number:
  327.             print title, '#'+str(number), 'found'
  328.  
  329.    The startElement() method is passed a string giving the name of the
  330.    element, and an instance containing the element's attributes. The
  331.    latter implements the AttributeList interface, which includes most of
  332.    the semantics of Python dictionaries. Therefore, the function looks
  333.    for comic elements, and compares the specified title and number
  334.    attributes to the search values. If they match, a message is printed
  335.    out.
  336.    
  337.    startElement() is called for every single element in the document. If
  338.    you added print 'Starting element:', name to the top of
  339.    startElement(), you would get the following output.
  340.    
  341. Starting element: collection
  342. Starting element: comic
  343. Starting element: writer
  344. Starting element: penciller
  345. Starting element: penciller
  346.  
  347.    To actually use the class, we need top-level code that creates
  348.    instances of a parser and of FindIssue, associates them, and then
  349.    calls a parser method to process the input.
  350.    
  351. from xml.sax import make_parser
  352. from xml.sax.handler import feature_namespaces
  353.  
  354. if __name__ == '__main__':
  355.     # Create a parser
  356.     parser = make_parser()
  357.     # Tell the parser we are not interested in XML namespaces
  358.     parser.setFeature(feature_namespaces, 0)
  359.  
  360.     # Create the handler
  361.     dh = FindIssue('Sandman', '62')
  362.  
  363.     # Tell the parser to use our handler
  364.     parser.setContentHandler(dh)
  365.  
  366.     # Parse the input
  367.     parser.parse(file)
  368.  
  369.    The make_parser class can automate the job of creating parsers. There
  370.    are already several XML parsers available to Python, and more might be
  371.    added in future. xmllib.py is included with Python 1.5, so it's always
  372.    available, but it's also not particularly fast. A faster version of
  373.    xmllib.py is included in xml.parsers. The xml.parsers.expat module is
  374.    faster still, so it's obviously a preferred choice if it's available.
  375.    make_parser determines which parsers are available and chooses the
  376.    fastest one, so you don't have to know what the different parsers are,
  377.    or how they differ. (You can also tell make_parser to try a list of
  378.    parsers, if you want to use a specific one).
  379.    
  380.    In SAX2, XML namespace are supported. Parsers will not call
  381.    startElement, but startElementNS if namespace processing is active.
  382.    Since our content handler does not implement the namespace-aware
  383.    methods, we request that namespace processing is deactivated. The
  384.    default of this setting varies from parser to parser, so you should
  385.    always set it to a safe value - unless your handlers support either
  386.    method.
  387.    
  388.    Once you've created a parser instance, calling setContentHandler tells
  389.    the parser what to use as the handler.
  390.    
  391.    If you run the above code with the sample XML document, it'll output
  392.    Sandman #62 found.
  393.    
  394. 3.2 Error Handling
  395.  
  396.    Now, try running the above code with this file as input:
  397.    
  398. <collection>
  399.   &foo;
  400.   <comic title="Sandman" number='62'>
  401. </collection>
  402.  
  403.    The &foo; entity is unknown, and the comic element isn't closed (if it
  404.    was empty, there would be a "/" before the closing ">". As a result,
  405.    you get a SAXParseException, e.g.
  406.    
  407. xml.sax._exceptions.SAXParseException: undefined entity at None:2:2
  408.  
  409.    The default code for the ErrorHandler interface automatically raises
  410.    an exception for any error; if that is what you want in case of an
  411.    error, you don't need to change the error handler. Otherwise, you
  412.    should provide your own version of the ErrorHandler interface, and at
  413.    minimum override the error() and fatalError() methods. The minimal
  414.    implementation for each method can be a single line. The methods in
  415.    the ErrorHandler interface-warning, error, and fatalError-are all
  416.    passed a single argument, an exception instance. The exception will
  417.    always be a subclass of SAXException, and calling str() on it will
  418.    produce a readable error message explaining the problem.
  419.    
  420.    So, to re-implement a variant of ErrorRaiser, simply define one of the
  421.    three methods to print the exception they're passed:
  422.    
  423.     def error(self, exception):
  424.         import sys
  425.         sys.stderr.write("\%s\n" \% exception)
  426.  
  427.    With this definition, non-fatal errors will result in an error
  428.    message, whereas fatal errors will continue to produce a traceback.
  429.    
  430. 3.3 Searching Element Content
  431.  
  432.    Let's tackle a slightly more complicated task, printing out all issues
  433.    written by a certain author. This now requires looking at element
  434.    content, because the writer's name is inside a writer element:
  435.    <writer>Peter Milligan</writer>.
  436.    
  437.    The search will be performed using the following algorithm:
  438.    
  439.    1.
  440.           The startElement method will be more complicated. For comic
  441.           elements, the handler has to save the title and number, in case
  442.           this comic is later found to match the search criterion. For
  443.           writer elements, it sets a inWriterContent flag to true, and
  444.           sets a writerName attribute to the empty string.
  445.    2.
  446.           Characters outside of XML tags must be processed. When
  447.           inWriterContent is true, these characters must be added to the
  448.           writerName string.
  449.    3.
  450.           When the writer element is finished, we've now collected all of
  451.           the element's content in the writerName attribute, so we can
  452.           check if the name matches the one we're searching for, and if
  453.           so, print the information about this comic. We must also set
  454.           inWriterContent back to false.
  455.           
  456.    Here's the first part of the code; this implements step 1.
  457.    
  458. from xml.sax import ContentHandler
  459. import string
  460.  
  461. def normalize_whitespace(text):
  462.     "Remove redundant whitespace from a string"
  463.     return string.join(string.split(text), ' ')
  464.  
  465. class FindWriter(ContentHandler):
  466.     def __init__(self, search_name):
  467.         # Save the name we're looking for
  468.         self.search_name = normalize_whitespace(search_name)
  469.  
  470.         # Initialize the flag to false
  471.         self.inWriterContent = 0
  472.  
  473.     def startElement(self, name, attrs):
  474.         # If it's a comic element, save the title and issue
  475.         if name == 'comic':
  476.             title = normalize_whitespace(attrs.get('title', ""))
  477.             number = normalize_whitespace(attrs.get('number', ""))
  478.             self.this_title = title
  479.             self.this_number = number
  480.  
  481.         # If it's the start of a writer element, set flag
  482.         elif name == 'writer':
  483.             self.inWriterContent = 1
  484.             self.writerName = ""
  485.  
  486.    The startElement() method has been discussed previously. Now we have
  487.    to look at how the content of elements is processed.
  488.    
  489.    The normalize_whitespace() function is important, and you'll probably
  490.    use it in your own code. XML treats whitespace very flexibly; you can
  491.    include extra spaces or newlines wherever you like. This means that
  492.    you must normalize the whitespace before comparing attribute values or
  493.    element content; otherwise the comparision might produce a wrong
  494.    result due to the content of two elements having different amounts of
  495.    whitespace.
  496.    
  497.     def characters(self, ch):
  498.         if self.inWriterContent:
  499.             self.writerName = self.writerName + ch
  500.  
  501.    The characters() method is called for characters that aren't inside
  502.    XML tags. ch is a string of characters. It is not necessarily a byte
  503.    string; parsers may also provide a buffer object that is a slice of
  504.    the full document, or they may pass Unicode objects (as the expat
  505.    parser does in Python 2.0).
  506.    
  507.    You also shouldn't assume that all the characters are passed in a
  508.    single function call. In the example above, there might be only one
  509.    call to characters() for the string "Peter Milligan", or it might call
  510.    characters() once for each character. More realistically, if the
  511.    content contains an entity reference, as in "Wagner & Seagle", the
  512.    parser might call the method three times; once for "Wagner ", once for
  513.    "&", represented by the entity reference, and again for " Seagle".
  514.    
  515.    For step 2 of FindWriter, characters() only has to check
  516.    inWriterContent, and if it's true, add the characters to the string
  517.    being built up.
  518.    
  519.    Finally, when the writer element ends, the entire name has been
  520.    collected, so we can compare it to the name we're searching for.
  521.    
  522.     def endElement(self, name):
  523.         if name == 'writer':
  524.             self.inWriterContent = 0
  525.             self.writerName = normalize_whitespace(self.writerName)
  526.             if self.search_name == self.writerName:
  527.                 print 'Found:', self.this_title, self.this_number
  528.  
  529.    To avoid being confused by differing whitespace, the
  530.    normalize_whitespace() function is called. This can be done because we
  531.    know that leading and trailing whitespace are insignificant for this
  532.    element, in this DTD.
  533.    
  534.    End tags can't have attributes on them, so there's no attrs parameter.
  535.    Empty elements with attributes, such as "<arc name="Season of
  536.    Mists"/>", will result in a call to startElement(), followed
  537.    immediately by a call to endElement().
  538.    
  539.    XXX how are external entities handled? Anything special need to be
  540.    done for them?
  541.    
  542. 3.4 Related Links
  543.  
  544.    http://www.megginson.com/SAX/
  545.           The SAX home page. This has the most recent copy of the
  546.           specification, and lists SAX implementations for various
  547.           languages and platforms. At the moment it's somewhat
  548.           Java-centric.
  549.           
  550.                        4. DOM: The Document Object Model
  551.                                        
  552.    The Document Object Model specifies a tree-based representation for an
  553.    XML document. A top-level Document instance is the root of the tree,
  554.    and has a single child which is the top-level Element instance; this
  555.    Element has children nodes representing the content and any
  556.    sub-elements, which may have further children, and so forth. Functions
  557.    are defined which let you traverse the resulting tree any way you
  558.    like, access element and attribute values, insert and delete nodes,
  559.    and convert the tree back into XML.
  560.    
  561.    The DOM is useful for modifying XML documents, because you can create
  562.    a DOM tree, modify it by adding new nodes and moving subtrees around,
  563.    and then produce a new XML document as output. You can also construct
  564.    a DOM tree yourself, and convert it to XML; this is often a more
  565.    flexible way of producing XML output than simply writing
  566.    <tag1>...</tag1> to a file.
  567.    
  568.    While the DOM doesn't require that the entire tree be resident in
  569.    memory at one time, the Python DOM implementation currently does keep
  570.    the whole tree in RAM. It's possible to write an implementation that
  571.    stores most of the tree on disk or in a database, and reads in new
  572.    sections as they're accessed, but this hasn't been done yet. This
  573.    means you may not have enough memory to process very large documents
  574.    as a DOM tree. A SAX handler, on the other hand, can potentially churn
  575.    through amounts of data far larger than the available RAM.
  576.    
  577. 4.1 Getting A DOM Tree
  578.  
  579.    The easiest way to get a DOM tree is to have it built for you. PyXML
  580.    offers two alternative implementations of the DOM, xml.dom.minidom and
  581.    4DOM. xml.dom.minidom is included in Python 2. It is a minimalistic
  582.    implementation, which means it does not provide all interfaces and
  583.    operations required by the DOM standard. 4DOM (XXX reference) is a
  584.    complete implementation of DOM Level 2 (which is currently work in
  585.    progress), so we will use that in the examples.
  586.    
  587.    One of the modules in the xml.dom package is xml.dom.ext.reader.Sax2,
  588.    which provides the functions FromXmlStream, FromXml, FromXmlFile, and
  589.    FromXmlFile which will construct a DOM tree from their input (a
  590.    file-like object, a string, a file name, and a URL, respectively).
  591.    They all return a DOM Document object.
  592.    
  593. import sys
  594. from xml.dom.ext.reader.Sax import FromXmlStream
  595. from xml.dom.ext import PrettyPrint
  596.  
  597. # parse the document
  598. doc = FromXmlStream(sys.stdin)
  599.  
  600. 4.2 Manipulating The Tree
  601.  
  602.    This HOWTO can't be a complete introduction to the Document Object
  603.    Model, because there are lots of interfaces and lots of methods.
  604.    Luckily, the DOM Recommendation is quite a readable document, so I'd
  605.    recommend that you read it to get a complete picture of the available
  606.    interfaces; this will only be a partial overview.
  607.    
  608.    The Document Object Model represents a XML document as a tree of
  609.    nodes, represented by an instance of some subclass of the Node class.
  610.    Some subclasses of Node are Element, Text, and Comment.
  611.    
  612.    We'll use a single example document throughout this section. Here's
  613.    the sample:
  614.    
  615. <?xml version="1.0" encoding="iso-8859-1"?>
  616. <xbel>
  617.   <?processing instruction?>
  618.   <desc>No description</desc>
  619.   <folder>
  620.     <title>XML bookmarks</title>
  621.     <bookmark href="http://www.python.org/sigs/xml-sig/" >
  622.       <title>SIG for XML Processing in Python</title>
  623.     </bookmark>
  624.   </folder>
  625. </xbel>
  626.  
  627.    Converted to a DOM tree, this document could produce the following
  628.    tree:
  629.    
  630. Element xbel None
  631.    Text #text '  \012  '
  632.    ProcessingInstruction processing 'instruction'
  633.    Text #text '\012  '
  634.    Element desc None
  635.       Text #text 'No description'
  636.    Text #text '\012  '
  637.    Element folder None
  638.       Text #text '\012    '
  639.       Element title None
  640.          Text #text 'XML bookmarks'
  641.       Text #text '\012    '
  642.       Element bookmark None
  643.          Text #text '\012      '
  644.          Element title None
  645.             Text #text 'SIG for XML Processing in Python'
  646.          Text #text '\012    '
  647.       Text #text '\012  '
  648.    Text #text '\012'
  649.  
  650.    This isn't the only possible tree, because different parsers may
  651.    differ in how they generate Text nodes; any of the Text nodes in the
  652.    above tree might be split into multiple nodes.)
  653.    
  654.   4.2.1 The Node class
  655.   
  656.    We'll start by considering the basic Node class. All the other DOM
  657.    nodes -- Document, Element, Text, and so forth -- are subclasses of
  658.    Node. It's possible to perform many tasks using just the interface
  659.    provided by Node.
  660.    
  661.    XXX table of attributes and methods readonly attribute DOMString
  662.    nodeName; attribute DOMString nodeValue; // raises(DOMException) on
  663.    setting // raises(DOMException) on retrieval readonly attribute
  664.    unsigned short nodeType; readonly attribute Node parentNode; readonly
  665.    attribute NodeList childNodes; readonly attribute Node firstChild;
  666.    readonly attribute Node lastChild; readonly attribute Node
  667.    previousSibling; readonly attribute Node nextSibling; readonly
  668.    attribute NamedNodeMap attributes; readonly attribute Document
  669.    ownerDocument;
  670.    
  671.    Node insertBefore(in Node newChild, in Node refChild)
  672.    raises(DOMException); Node replaceChild(in Node newChild, in Node
  673.    oldChild) raises(DOMException); Node removeChild(in Node oldChild)
  674.    raises(DOMException); Node appendChild(in Node newChild)
  675.    raises(DOMException); boolean hasChildNodes(); Node cloneNode(in
  676.    boolean deep);
  677.    
  678.   4.2.2 Document, Element, and Text nodes
  679.   
  680.    The base of the entire tree is the Document node. Its documentElement
  681.    attribute contains the Element node for the root element. The Document
  682.    node may have additional children, such as ProcessingInstruction
  683.    nodes; the complete list of children XXX.
  684.    
  685. 4.3 Walking Over The Entire Tree
  686.  
  687.    The xml.dom package also includes various helper classes for common
  688.    tasks such as walking over trees.
  689.    
  690.    The Walker class
  691.    
  692.    Introduction to the walker class
  693.    
  694. 4.4 Building A Document
  695.  
  696.    Intro to builder
  697.    
  698. 4.5 Processing HTML
  699.  
  700.    Intro to HTML builder
  701.    
  702. 4.6 Related Links
  703.  
  704.    http://www.w3.org/DOM/
  705.           The World Wide Web Consortium's DOM page.
  706.           
  707.    http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/
  708.           The DOM Level 1 Recommendation. Unlike most standards, this one
  709.           is actually pretty readable, particularly if you're only
  710.           interested in the Core XML interfaces.
  711.           
  712.                                   5. Glossary
  713.                                        
  714.    XML has given rise to a sea of acronyms and terms. This section will
  715.    list the most significant terms, and sketch their relevance.
  716.    
  717.    Many of the following definitions are taken from Lars Marius Garshol's
  718.    SGML glossary, at
  719.    http://www.stud.ifi.uio.no/larsga/download/diverse/sgmlglos.html.
  720.    
  721.    DOM (Document Object Model)
  722.           The Document Object Model is intended to be a platform- and
  723.           language-neutral interface that will allow programs and scripts
  724.           to dynamically access and update the content, structure and
  725.           style of documents. Documents will be represented as tree
  726.           structures which can be traversed and modified.
  727.           
  728.    DTD (Document Type Definition)
  729.           A Document Type Definition (nearly always called DTD) defines
  730.           an XML document type, complete with element types, entities and
  731.           an XML declaration. In other words: a DTD completely describes
  732.           one particular kind of XML document, such as, for instance,
  733.           HTML 3.2.
  734.           
  735.    SAX (Simple API for XML)
  736.           SAX is a simple standardized API for XML parsers developed by
  737.           the contributors to the xml-dev mailing list. The interface is
  738.           mostly language-independent, as long as the language is
  739.           object-oriented; the first implementation was written for Java,
  740.           but a Python implementation is also available. SAX is supported
  741.           by many XML parsers.
  742.           
  743.    XML (eXtensible Markup Language)
  744.           XML is an SGML application profile specialized for use on the
  745.           web and has its own standards for linking and stylesheets under
  746.           development.
  747.           
  748.    XSL (eXtensible Style Language)
  749.           XSL is a proposal for a stylesheet language for XML, which
  750.           enables browsers to lay out XML documents in an attractive
  751.           manner, and also provides a way to convert XML documents to
  752.           HTML.
  753.           
  754.                             About this document ...
  755.                                        
  756.    Python/XML HOWTO
  757.    
  758.    This document was generated using the LaTeX2HTML translator.
  759.    
  760.    LaTeX2HTML is Copyright ⌐ 1993, 1994, 1995, 1996, 1997, Nikos Drakos,
  761.    Computer Based Learning Unit, University of Leeds, and Copyright ⌐
  762.    1997, 1998, Ross Moore, Mathematics Department, Macquarie University,
  763.    Sydney.
  764.    
  765.    The application of LaTeX2HTML to the Python documentation has been
  766.    heavily tailored by Fred L. Drake, Jr. Original navigation icons were
  767.    contributed by Christopher Petrilli.
  768.      _________________________________________________________________
  769.    
  770.                               Python/XML HOWTO
  771.