Re: [PHP-XML-DEV] Can SimpleXML still return all namespaces?
[email protected] (Rob Richards) Mon, 30 Jul 2007 09:44:13 -0400
| Newsgroups | php.xml.dev |
|---|---|
| Message-ID | <[email protected]> |
Hi Ben, Ben Schmidt wrote: > Hi, Rob, > >> This is exactly the purpose of the children() and attributes() methods. >> They are used to set a namespace scope to work within. > > Fantastic! They very nearly do what I want. The biggest problem is > simply this: the behaviour is not documented or demonstrated in the > manual! Agreeably I am a bit of a newbie, but even so, with such > limited documentation it is very easy to leap to wrong > conclusions/make wrong assumptions about the behaviour of the module. > > If you can point me to where I can get the documentation source, I > would be happy to have a go improving it and sending you diffs. http://doc.php.net/php/dochowto/ > >> So what you are proposing is just a way to be able to work with >> SimpleXML in a completely namespace ignorant way? >> Basically, ignore all namespaces/prefixes and work directly with >> local names only? > > Yes. I think that would be useful. SimpleXML would then not only be > able to work with simple XML documents, but also do simple processing > of more complicated documents. I am looking into this. I tossed this idea around with a few others and they also agree it might be a good idea to allow this type of functionality (though it would *NOT* be the default behavior. You would need to enable it via some parameter when working with SimpleXML). Still thinking about the implementation for this. > > Having done some further investigation in light of your exciting > revelation about the way children and attributes methods work, my > requests/suggestions are somewhat different. Here they are: > > 1. IMHO children() and attributes() without a parameter should not > change the namespace scope being used. In particular as, to my > knowledge, 'attributes' is the only way to enumerate attributes > (unlike elements which you can do by enumerating the object itself > without using 'children') there needs to be a way to enumerate the > attributes in the current scope. Passing no parameter is the most > logical way to do this. But passing no parameter resets the scope to > 'unprefixed' from what I can gather, which is annoying. You need to > keep track of the scope yourself and can't easily write generalised > subroutines that work in the current scope of an object. This is not going to change. Those 2 methods are meant to determine namespace scope. SimpleXML is really meant to work with simple documents. > > 2. There should be a way to get the current scope of a > SimpleXMLElement. (If this were added, at least there'd be a > workaround for 1, too!) It would need to return something magic for > 'unprefixed' and children and attributes made to understand the magic > value. Well, I think that would be better than returning a list of > '$ns,$is_prefix' anyway! getNamespaces() - though this will also add namespaces from attributes as well - but again if working with complex documents, SimpleXML alone might be the wrong choice - you can mix DOM and SimpleXML without the overhead of having to copy documents. > > 3. It would be handy to have a method to set the current scope, rather > than needing to use 'children' or 'attributes'. This would be > particularly useful for the root node, to set the scope for the > processing of the entire document. I realise now that it can be done > with a constructor, but IMHO it would be easier to understand and > convenient if a separate method were provided. I think it would make > code more readable, too. This is not going to change. All of this can already be done without having to add additional methods. > > 4. A local-name-only mode would be good, as mentioned above. answered above Rob