[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [xml] problem (bug?) with xmlNewChild()



On Mon, Oct 28, 2002 at 10:19:09AM +0100, Christian Glahn wrote:
> Hallo Daniel,
> hallo list,
> 
> I found an interesting issue in xmlNewChild(). I thought, it is possible
> to append a new child to documents, elements and document fragments with 

  Document fragments are a DOM only paradigm. It does not reflect in XML
itself. As a result while it was originally added to the set of node type
the API for this type had nearly zero usage.

> xmlNewChild(). It showed that document fragments are not supported by this 
> function, although it would make sense to do so.  I concider this as a bug

  I still don't see (except purely for DOM compatibility mode) why this
is useful. I may apply the patch anyway.

> If no namespace structure is passed to xmlNewChild() it appears, that the 
> namespace of the parent node is silently taken as namespace for the new node
> as well. I was quite surprized about this behaviour, since I was expecting a
> node with no namespace set. Although the given implementation is unchanged 
> at least since 2.4.20, I *think* that's wrong as well.   

  No it's just the semantic of this operation. If you want a different
semantic use a different function, I don;t want to change that now.

> Depending on the aspect I mentioned last there are two possible fixes:
> 
> /* 1 - my prefered one */
> /* tree.c, ~line 2085 */
>     if ((parent->type == XML_ELEMENT_NODE) ||
>         (parent->type == XML_DOCUMENT_FRAG_NODE)) {
>         cur = xmlNewDocNode(parent->doc, ns, name, content);
>     }
> 
> although in this case a switch statement should be more elegant:
> 
> /* 1a */
>    switch (parent->type) {
>    case XML_ELEMENT_NODE:
>    case XML_DOCUMENT_NODE:
>    case XML_HTML_DOCUMENT_NODE:
>    case XML_DOCUMENT_FRAG_NODE:
>       cur = xmlNewDocNode(parent->doc, ns, name, content);
>       break;
>    default:
>       return(NULL);
>       break;
>    }
> 
> /* 2 - minimum alternative */
> /* tree.c ~line 2095 */
>    } else if (parent->type == XML_DOCUMENT_FRAG_NODE) {
>       cur = xmlNewDocNode( parent->doc, ns, name, content);
>    } else {
> /* ... */

  I don't have the time to do this right now. Provide a patch, I will
apply it if it doesn't modify the seamtic of the operation for the other
node types.

Daniel

-- 
Daniel Veillard      | Red Hat Network https://rhn.redhat.com/
veillard redhat com  | libxml GNOME XML XSLT toolkit  http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine http://rpmfind.net/



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]