Re: [dom4j-user] Namespaces become blank when inserting or updating elements

2007-08-27 Thread Evan Kirkconnell




I produced this test from the example: http://www.dom4j.org/guide.html 
Maybe something with how you're loading the document is causing your
problems.

import java.net.URL;
import java.io.*;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class Test {

    public static void main(String[] args) throws Exception{
        Document doc = parse(args[0]);
        write(doc);       
    }

    public static Document parse(String filename) throws Exception {
    SAXReader reader = new SAXReader();
    Document document = reader.read( new FileReader(filename) );
    return document;
    }
    
    public static void write(Document document) throws Exception {
    // Pretty print the document to System.out
    OutputFormat format = OutputFormat.createPrettyPrint();
    writer = new XMLWriter( System.out, format );
    writer.write( document );   
    }
}

I ran it on your XML and it printed this to standard out:



  
   
     
  VALUE  
  VALUE  
  VALUE  
  VALUE 
      
     
  VALUE  
   
    VALUE  
    VALUE 
   
     
   


Also, when you have a DOM4J document in memory, it doesn't have the
concept of inheriting namespaces.  Every node has a namespace, so if
you change the namespace of one node, none of its descendants are
influenced.

--Evan


Jon Brisbin wrote:

  Evan Kirkconnell wrote:
  
  
Are you creating the problem elements with code or are they in your 
loaded document?
  

  
  The problem elements are the direct descendants of the element I add the 
namespace to.

I created a test case to see what's going on. It seems to be related to 
the SAXContentHandler creating the DOM4J Document for me.

When I create the DOM4J document by reading in an XML file using the 
SAXContentHandler, the default namespace gets stripped off. Here's the 
file I read in:





VALUE
VALUE
VALUE
VALUE


VALUE

VALUE
VALUE





I read the XML file into a DOM4J Document:

String NS = "urn:bogus-namespace";
Map namespaces = new HashMap();
namespaces.put( "", NS );

DocumentFactory df = DocumentFactory.getInstance();
df.setXPathNamespaceURIs( namespaces );

SAXContentHandler ch = new SAXContentHandler();
p.parse( ClassLoader.getSystemResourceAsStream( "dom4j-test.xml" ), ch );

Document d = ch.getDocument();
System.out.println( d.asXML() );

When I printed out the document, the default namespace gets stripped off:





VALUE
VALUE
VALUE
VALUE


VALUE

VALUE
VALUE






So I added the namespace back in on the root element and tried it again:

d.getRootElement().addNamespace( "", NS );


Which manifested the problem:





VALUE
VALUE
VALUE
VALUE


VALUE

VALUE
VALUE






When I read the document in using the internal Java 1.5 Xerces parser, 
then used the DOM4J DOMReader to create a Document out of the XML file, 
everything works as expected and the default namespace is preserved like 
I expect.

I've since changed my application to use a DOMReader and have abandoned 
the SAXContentHandler as a method for creating DOM4J Documents from 
files. Using a W3C DOM first seems a little unnecessary, but if that's 
what I've got to do...

  






-
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/___
dom4j-user mailing list
dom4j-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dom4j-user


Re: [dom4j-user] Namespaces become blank when inserting or updating elements

2007-08-27 Thread Jon Brisbin
Evan Kirkconnell wrote:
> Are you creating the problem elements with code or are they in your 
> loaded document?
>   
The problem elements are the direct descendants of the element I add the 
namespace to.

I created a test case to see what's going on. It seems to be related to 
the SAXContentHandler creating the DOM4J Document for me.

When I create the DOM4J document by reading in an XML file using the 
SAXContentHandler, the default namespace gets stripped off. Here's the 
file I read in:





VALUE
VALUE
VALUE
VALUE


VALUE

VALUE
VALUE





I read the XML file into a DOM4J Document:

String NS = "urn:bogus-namespace";
Map namespaces = new HashMap();
namespaces.put( "", NS );

DocumentFactory df = DocumentFactory.getInstance();
df.setXPathNamespaceURIs( namespaces );

SAXContentHandler ch = new SAXContentHandler();
p.parse( ClassLoader.getSystemResourceAsStream( "dom4j-test.xml" ), ch );

Document d = ch.getDocument();
System.out.println( d.asXML() );

When I printed out the document, the default namespace gets stripped off:





VALUE
VALUE
VALUE
VALUE


VALUE

VALUE
VALUE






So I added the namespace back in on the root element and tried it again:

d.getRootElement().addNamespace( "", NS );


Which manifested the problem:





VALUE
VALUE
VALUE
VALUE


VALUE

VALUE
VALUE






When I read the document in using the internal Java 1.5 Xerces parser, 
then used the DOM4J DOMReader to create a Document out of the XML file, 
everything works as expected and the default namespace is preserved like 
I expect.

I've since changed my application to use a DOMReader and have abandoned 
the SAXContentHandler as a method for creating DOM4J Documents from 
files. Using a W3C DOM first seems a little unnecessary, but if that's 
what I've got to do...

-- 


Thanks!

Jon Brisbin
Portal Webmaster
NPC International, Inc.
http://www.npcinternational.com



-
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
___
dom4j-user mailing list
dom4j-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dom4j-user


Re: [dom4j-user] Namespaces become blank when inserting or updating elements

2007-08-27 Thread Evan Kirkconnell
Are you creating the problem elements with code or are they in your 
loaded document?

Jon Brisbin wrote:
> Searched in the archives and didn't find what I was looking for (but not 
> really sure what I'm looking for, so don't throw things at me if this 
> has been asked before).
>
> I have an XML template that I read into a DOM4J (using 1.6) document 
> when I begin processing. The default namespace is set in the document 
> and I set it again, just for good measure:
>
> SAXParser p = SAXParserFactory.newInstance().newSAXParser();
>
> DocumentFactory df = DocumentFactory.getInstance();
> df.setXPathNamespaceURIs( namespaces );
>
> SAXContentHandler ch = new SAXContentHandler();
> p.parse( ClassLoader.getSystemResourceAsStream( TEMPLATE_FILE ), ch );
>
> Document doc = ch.getDocument();
> doc.getRootElement().addNamespace( "", EFILE_NS );
>
>
> When I process the raw data, I do XPath lookups on nodes in the template 
> and set them like so:
>
> XPath xp = root.createXPath( xpath );
> xp.setNamespaceURIs( namespaces );
> Element e = (Element) xp.selectSingleNode( root );
> if ( e != null ) {
> e.setText( value );
> return e;
> } else {
> return root;
> }
>
> But when the file is generated, some of the elements below the root 
> element (but not all of them) have namespaces set to '' (blank). This 
> causes the other party's XML processing to blow up with the error that 
> the element with the blank namespace isn't in the E-file namespace, like 
> it's supposed to be.
>
> If the namespace is set in the template, then I would expect it work 
> correctly when I've read that document in and set the namespaces 
> accordingly. That's not happening and some elements in the DOM are being 
> "taken out" of the default namespace.
>
> Can someone shed some light on why this is happening?
>
>   



-
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
___
dom4j-user mailing list
dom4j-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dom4j-user