Solved

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

Posted on 2007-03-27
18
1,014 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
3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

 
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

Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
reverse digits of a number using for loop 5 40
Running JavaFX on JDeveloper 12C 1 31
Macro to import XML in Access 2013 2 36
Desingning Refactoring existing code 2 24
This was posted to the Netbeans forum a Feb, 2010 and I also sent it to Verisign. Who didn't help much in my struggles to get my application signed. ------------------------- Start The idea here is to target your cell phones with the correct…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
Viewers will learn about the regular for loop in Java and how to use it. Definition: Break the for loop down into 3 parts: Syntax when using for loops: Example using a for loop:
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.

770 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