?
Solved

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

Posted on 2007-03-27
18
Medium Priority
?
1,025 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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 400 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
Use Filtering Commands to Process Files in Linux

Learn how to manipulate data with the help of various filtering commands such as `cat`, `fmt`, `pr`, and others in Linux.

 
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 800 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 800 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

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

The Confluence of Individual Knowledge and the Collective Intelligence At this writing (summer 2013) the term API (http://dictionary.reference.com/browse/API?s=t) has made its way into the popular lexicon of the English language.  A few years ago, …
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 one way to get user input in Java. Introduce the Scanner object: Declare the variable that stores the user input: An example prompting the user for input: Methods you need to invoke in order to properly get  user input:
Viewers will learn how to properly install Eclipse with the necessary JDK, and will take a look at an introductory Java program. Download Eclipse installation zip file: Extract files from zip file: Download and install JDK 8: Open Eclipse and …
Suggested Courses
Course of the Month15 days, 6 hours left to enroll

741 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