[jdom-interest] JDOM Issue #5 - DTD-aware Attribute output
Paul Libbrecht
paul at hoplahup.net
Tue Mar 27 06:17:18 PDT 2012
Rolf,
Le 26 mars 2012 à 17:20, Rolf Lear a écrit :
> Just checking that we have things 'straight'.... since I have not heard
> back from you.
I'm sorry, I'm swamped and have to accept it.
> Three things...
> 1. I said that SAX parser will ignore the DTD unless you 'DTD-validate'...
> but I was wrong, (at least) Xerces SAX parser will apply the default
> attribtues.
And Saxon AElfred.
Xerces is the default in all java distributions of Sun and Apple, or?
(Sun's Xerces that is)
> 2. You said "Removing the validation, sadly disables the passing of
> attribute presence info, it seems." which I think you were saying because I
> had said that before to you.... but this is wrong .. .see above. Do you
> have 'evidence' that this is true though? Or are you basing this on what I
> told you before...?
The example I provided showed it to me: passing no parameter to new SAXBuilder will avoid, with Xerces' default, the passing of any location info.
I'm sorry, I'll have to accept jDOM 2.0 to go out without evaluating a full solution...
paul
> 3. It seems (at least with the Xerces 2.11 parser) that using
> non-validating SAXBuilder will produce the exact results you want... (with
> the exception of Namespace declarations). Can you confirm this?
>
> I have been thinking about the Namespace problem, and, I don't think that
> there is a 'good' solution on the 'output' side of things, but, there is
> value in having a tool that:
> - scans the entire 'Element' tree
> - 'explicitly' declares namespaces at the highest common node in the tree
>
> This 'tool' will thus 'declare' the namespace at a 'high' level, and the
> outputter will not need to re-declare them at the lower levels.... which, I
> would guess, would result in removing many low-level Namespace
> declarations, and replace them with a single high-level declaration. This
> would 'solve' your problem in one sense.
>
> Another alternative for you would be to manually remove the not-specified
> attributes just prior to output:
>
> for (Element e : doc.getDescendants(Filters.element())) {
> if (e.hasAttributes()) {
> for (Iterator<Attribute> it = e.getAttributes().iterator();
> it.hasNext();) {
> Attribute a = it.next();
> if (!a.isSpecified()) {
> it.remove();
> }
> }
> }
> }
>
> if you physically remove the (default) attributes from the document, then
> they will not affect the namespace calculations for the output either.
>
> Rolf
>
>
>> In fact, going back to the original example, I have the following code:
>>
>> public static void main(String[] args) throws JDOMException,
> IOException {
>> String xml =
>>
> "http://svn.activemath.org/LeAM-calculus/LeAM_calculus/oqmath/contin.oqmath";
>> SAXBuilder builder = new SAXBuilder();
>> Document doc = builder.build(xml);
>> for (Element e : doc.getDescendants(Filters.element())) {
>> if (e.hasAttributes()) {
>> for (Attribute a : e.getAttributes()) {
>> if (!a.isSpecified()) {
>> System.out.println("Attribute was defaulted " + a);
>> }
>> }
>> }
>> }
>> Format speconly = Format.getPrettyFormat();
>> speconly.setSpecifiedAttributesOnly(true);
>> XMLOutputter xout = new XMLOutputter(speconly);
>> xout.output(doc, System.out);
>> }
>>
>> And it does exactly what you want.... (except for the namespaces).
>>
>> Rolf
>>
More information about the jdom-interest
mailing list