This solved the issue I was having with MSXML not parsing XHTML as XML without an xml-declaration – which is the only format that Microsoft Expression Web will auto-detect as XHTML without forcing it to fail over to it. ([menu] Tools > Page Editor Options > Authoring > Secondary Schema = XHTML 1.0 Strict).
I coded up a simple test case
Normally for all things XML in Javascript I have a handy lib that normally abstracts this away for me but for a test-case I’m staying close to the metal.
var l_xml_document = new ActiveXObject("Msxml2.DOMDocument.3.0");
l_xml_document.async = false;
l_xml_document.validateOnParse = false;
l_xml_document.resolveExternals = false;
l_xml_document.load(p_file);
I’ll run through each line
var l_xml_document = new ActiveXObject("Msxml2.DOMDocument.3.0");
This creates an Object which is IE’s version of the W3C standard DOM Document. I ask for the MSXML 3.0 DOM Document by name because its the default for “Msxml2.DOMDocument” . This means I’m not going to get any surprises if the default goes to v6.0 and it changes behavior. V3 seems to be installed on all Windows machines by default. From memory it came as part of IE5.5
l_xml_document.async = false;
This disables asynchronous mode – in this case I’m happy to wait for the file to arrive
l_xml_document.validateOnParse = false;
This was the clincher – without setting validateOnParse to false I was unable to parse XHTML in the following format (which is valid XML – the xml-declaration is optional according to the w3c spec)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head></head><body></body></html>
I needed to add the xml-declaration at the start.
<?xml version="1.0" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head></head><body></body></html>
When I did add the xml-declaration I had to force Microsoft Expression Web to fail-over this as XHTML, it would not detect it.
Using either the ‘xml-declaration’ or ‘validateOnparse set to false’ workarounds, DOMDocument was very slow to load the XML, which brings us to the next line
l_xml_document.resolveExternals = false;
This prevents Msxml2.DOMDocument from trying to load and DTD’s and validate your code. This can take 5 seconds per request – so you really don’t want this unless there is a real danger that the XML you get back will be not conform to XHTML.
l_xml_document.load(p_file);
Load it. Not explaining this.
Hope this helps someone. Special thanks to John-Daniel Trask and Chris Bentley who commented on my original post.
Hi, thanks for this. It helped me fix a completely different problem (trying loading a XML file I kept getting ‘null’). Luckily I came across this and the ‘validateOnParse = false’ fixed the issue.