Thank you Michael, by using the LSOutput with my FileWriter I was able
to get this to work. For those who may have also encountered this
problem, the actual code is below.
Looking at this further, how would the use of an LSParser w/ LSInputs
compare to using the DocumentBuilder JAXP interface? Is the LSParser
just DOM 3's answer to the lack of a parser interface in the DOM 1 & 2
standards, or is it something more?
Again, thanks for the help.
---------------------
public void writeXML(Element element, File outputFile) throws Exception{
DOMImplementation domImpl =
element.getOwnerDocument().getImplementation();
DOMImplementationLS domImplLS = (DOMImplementationLS)
domImpl.getFeature("LS", "3.0");
LSSerializer serializer = domImplLS.createLSSerializer();
LSOutput serializerOut = domImplLS.createLSOutput();
serializerOut.setCharacterStream(new FileWriter(outputFile));
serializer.write(element, serializerOut);
}
Michael Glavassevich wrote:
Hi Chad,
The encoding declared in your document (in the XML declaration) and the
actual encoding of your document probably don't match after you've
serialized it to a file. You should be passing a FileOutputStream to the
serializer and let it handle the character encoding instead of using a
FileWriter which assumes the platform default encoding (which could be
anything) is acceptable. This was discussed on the j-dev list many months
ago. The thread starts here [1] in the archives if you're interested.
Thanks.
[1]
http://mail-archives.apache.org/mod_mbox/xerces-j-dev/200504.mbox/[EMAIL PROTECTED]
Michael Glavassevich
XML Parser Development
IBM Toronto Lab
E-mail: [EMAIL PROTECTED]
E-mail: [EMAIL PROTECTED]
Chad La Joie <[EMAIL PROTECTED]> wrote on 09/06/2006 02:26:30 PM:
I'm using Xerces-J 2.8.0 as my endorsed JAXP 1.3 parser. My code
needs to write
out XML and later read it back in. I'm using the LSSerializer to
write out the
root element node of my document to a string and then using a FileWriter
to
write it out to disk. Then I use a FileInputStream to read it in
and parse it
with a DocumentBuilder.
When I do this I get a SAX exception indicating I have invalid content
in the
prolog. I searched the archives and found a thread where someone
else had this
issue. It was caused by non-visible characters in the prolog. I
validated,
through an octal dump, that the file written by my code didn't have any
extra
characters.
Attached is a test case that reproduces the problem. Any assistance on
this
would be greatly appreciated. I'm sure I'm just messing up
something with the
Serializer but I'm not sure what.
--
Chad La Joie 2052-C Harris Bldg
OIS-Middleware 202.687.0124
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSSerializer;
public class XMLSerializeTest {
private static DocumentBuilder docBuilder;
public static void main(String[] args) throws Exception{
String xmlFilePath = "/tmp/example.xml";
DocumentBuilderFactory builderFactory =
DocumentBuilderFactory.newInstance();
docBuilder = builderFactory.newDocumentBuilder();
// Create an example element
Element exampleXML = createElement();
// Write it out to a file and read it back in
// It fails when reading it in
File xmlFile = new File(xmlFilePath);
writeXML(exampleXML, xmlFile);
Element readXML = readXML(xmlFile);
// Write it out to STDOUT
System.out.println(nodeToString(readXML));
}
public static Element createElement() throws Exception{
Document document = docBuilder.newDocument();
Element rootElement = document.createElementNS("http://example.org
", "example:foo");
document.appendChild(rootElement);
rootElement.setAttribute("attrib1", "somevalue");
rootElement.setAttribute("attrib2", "somevalue");
return rootElement;
}
public static void writeXML(Element element, File output)
throwsException{
FileWriter out = new FileWriter(output);
out.write(nodeToString(element));
out.flush();
out.close();
}
public static String nodeToString(Node node) {
DOMImplementation domImpl = node.getOwnerDocument().
getImplementation();
DOMImplementationLS domImplLS = (DOMImplementationLS)
domImpl.getFeature("LS", "3.0");
LSSerializer serializer = domImplLS.createLSSerializer();
return serializer.writeToString(node);
}
public static Element readXML(File input) throws Exception{
FileInputStream in = new FileInputStream(input);
Document document = docBuilder.parse(in);
return document.getDocumentElement();
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
--
Chad La Joie 2052-C Harris Bldg
OIS-Middleware 202.687.0124
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]