Solved

Create an XML document in memory using createDocument(null, null, null) throws error

Posted on 2007-03-27
18
1,018 Views
Last Modified: 2007-12-19
I am creating an XML document in memory.  When it gets to the following code:

                        DOMImplementation impl = builder.getDOMImplementation();

                        // create the root element
                        org.w3c.dom.Document doc = impl.createDocument(null, null, null);

it throws the following error:
org.w3c.dom.DOMException: INVALID_CHARACTER_ERR: An invalid or illegal XML character is specified.

I have looked on the net and apparently there is an issue with passing null, null, null - for example here:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4913260

However, it doesn't say how to correct the issue.  Any help please?  :-)
0
Comment
Question by:PurpleSlade
  • 6
  • 4
  • 4
  • +1
18 Comments
 
LVL 9

Expert Comment

by:owenli27
ID: 18800968
The second parameter, qualified name of the document element,  is NOT allowed to be 'null'

0
 
LVL 30

Assisted Solution

by:Mayank S
Mayank S earned 100 total points
ID: 18801074
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance () ;
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder () ;
StringReader reader = new StringReader ( "<ROOT/>" ) ;
Document doc = docBuilder.parse ( new InputSource ( reader ) ) ;
reader.close () ;

- gives you a blank document with a root node. You can append children to the root node thereafter
0
 
LVL 2

Author Comment

by:PurpleSlade
ID: 18801092
Hmmm, I got the example from here which used null parameters:

http://www.rgagnon.com/javadetails/java-0530.html

What exactly does "qualified name of the document element to be created" mean?
0
The New “Normal” in Modern Enterprise Operations

DevOps for the modern enterprise offers many benefits — increased agility, productivity, and more, but digital transformation isn’t easy, especially if you’re not addressing the right issues. Register for the webinar to dive into the “new normal” for enterprise modern ops.

 
LVL 86

Expert Comment

by:CEHJ
ID: 18801112
Document doc = DocumentBuilder.newDocument();
0
 
LVL 30

Expert Comment

by:Mayank S
ID: 18801157
Thus spake the HexaGenius ;-)
0
 
LVL 9

Expert Comment

by:owenli27
ID: 18801288
>>> Hmmm, I got the example from here which used null parameters:
It depends on what version xerces.jar you are using.  The one you are using is supposed like this one:
org.apache.xerces.dom.DOMImplementationImpl.createDocument() ->
public Document createDocument(String s, String s1, DocumentType documenttype)
        throws DOMException
    {
        if(documenttype != null && documenttype.getOwnerDocument() != null)
        {
            throw new DOMException((short)4, "DOM005 Wrong document");
        } else
        {
            DocumentImpl documentimpl = new DocumentImpl(documenttype);
            org.w3c.dom.Element element = documentimpl.createElementNS(s, s1);
            documentimpl.appendChild(element);
            return documentimpl;
        }
    }

Then, org.apache.xerces.dom.CoreDocumentImpl.createElementNS() ->
public Element createElementNS(String s, String s1)
        throws DOMException
    {
        if(errorChecking && !isXMLName(s1))
            throw new DOMException((short)5, "DOM002 Illegal character");
        else
            return new ElementNSImpl(this, s, s1);
    }

Then:
 public static boolean isXMLName(String s)
    {
        if(s == null)
            return false;
        else
            return XMLCharacterProperties.validName(s);
    }

0
 
LVL 86

Accepted Solution

by:
CEHJ earned 200 total points
ID: 18801305
Spake wrongly - should have been

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
0
 
LVL 30

Expert Comment

by:Mayank S
ID: 18801332
Correctly spake considering DocumentBuilder represented its instance ;-)
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 18801344
;-)
0
 
LVL 9

Expert Comment

by:owenli27
ID: 18801366
You can try this:
DOMImplementation impl = builder.getDOMImplementation();
org.w3c.dom.Document doc = impl.createDocument(null, "XMLRoot", null);

NodeList children = doc.getElementsByTagName("XMLRoot");
System.out.println("Initialized" + children.getLength());
0
 
LVL 9

Expert Comment

by:owenli27
ID: 18801380
What exactly does "qualified name of the document element to be created" mean?
- you XML document Root element name
0
 
LVL 2

Author Comment

by:PurpleSlade
ID: 18801550
owenli27 - how do you get a handle to the root node once it's been created through that parameter?  Is there something like Element root = doc.getRootElement() or the like?

CEHJ - your amended solution compiles fine and there are no more errors - it's probably what I will end up using since it is pretty clean.

mayankeagle - I haven't tried your solution but I am assuming it also works.

0
 
LVL 9

Assisted Solution

by:owenli27
owenli27 earned 200 total points
ID: 18801603
Document doc = implementation.createDocument(null, "MyXMLRoot", null);
Element root = doc.getDocumentElement();
System.out.println("Root Element Name = " + root.getNodeName());
0
 
LVL 2

Author Comment

by:PurpleSlade
ID: 18801628
OK - that works as well.  So, 3 working solutions ... now the point divvying.  Thanks everyone for your help!
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 18801680
:-)
0
 
LVL 2

Author Comment

by:PurpleSlade
ID: 18801793
Hm - I probably should have put owenli27's solution as the accepted since he answered the specific question I had about the method that didn't work ... if you want owenli27 I can try and have that changed, otherwise I will leave it.  Let me know.  My apologies, for some reason I thought that they would all show as "Assisted" solutions.  The new format had me confused since it doesn't explicity state that I was accepting one particular solution.  
0
 
LVL 9

Expert Comment

by:owenli27
ID: 18801914
It really doesn't matter and you can just leave it.  
Thanks for rewards.
0
 
LVL 30

Expert Comment

by:Mayank S
ID: 18802320
>> I haven't tried your solution but I am assuming it also works.

Yes it does :)
0

Featured Post

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
How to get all the API from website? 11 104
jsp insert to database example 2 46
TSQL query to generate xml 4 46
Eclipse for Java EE development 2 28
Introduction Java can be integrated with native programs using an interface called JNI(Java Native Interface). Native programs are programs which can directly run on the processor. JNI is simply a naming and calling convention so that the JVM (Java…
I was working on a PowerPoint add-in the other day and a client asked me "can you implement a feature which processes a chart when it's pasted into a slide from another deck?". It got me wondering how to hook into built-in ribbon events in Office.
The viewer will learn how to implement Singleton Design Pattern in Java.
This theoretical tutorial explains exceptions, reasons for exceptions, different categories of exception and exception hierarchy.

860 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question