-
Bug
-
Resolution: Fixed
-
P3
-
5.0
-
b49
-
x86, sparc
-
linux, solaris_2.6, solaris_9, windows_xp
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-2116264 | 1.3.0 | Jeff Suttor | P3 | Closed | Fixed | 1.3 |
Name: apR10229 Date: 09/24/2003
Filed By : SPB JCK team (###@###.###)
JDK : java full version "1.5.0-beta-b20"
JCK : 1.5
Platform[s] : Solaris
switch/Mode :
JCK test owner : http://javaweb.eng/jct/sqe/JCK-tck/usr/owners.jto
Failing Test [s] : N/A
Problem description
===================
If DOMParser uses a filter, skipping one element, that has two children, then it
constructs wrong DOM structure. For example, if we shall skip element node <ELEMENT1>, using
FILTER_SKIP flag, for following XML:
<ROOT><ELEMENT1><CHILD1/><CHILD2/></ELEMENT1></ROOT>
after parsing we'll get:
<ROOT><CHILD1><CHILD2/></CHILD1></ROOT>
This behavior isn't described in the Java API Spec.
Minimized test:
===============
------- Test.java -------
import java.io.*;
import org.w3c.dom.ls.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.w3c.dom.traversal.*;
public class Test {
public static void main(String[] argv) {
String xml = "<?xml version=\"1.0\"?><ROOT><ELEMENT1><CHILD1/><CHILD2/></ELEMENT1></ROOT>";
System.out.println("Before parsing: "+xml);
DocumentBuilder parser = null;
Document doc = null;
try {
parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
doc = parser.parse(new StringBufferInputStream(xml));
} catch (Throwable e) {
e.printStackTrace();
}
DOMImplementationLS implLS = (DOMImplementationLS) doc.getImplementation().getFeature("LS","3.0");
DOMParser dp = implLS.createDOMParser(DOMImplementationLS.MODE_SYNCHRONOUS,null);
DOMInput src = implLS.createDOMInput();
src.setStringData(xml);
dp.setFilter(
new DOMParserFilter() {
public short startElement(Element elt) {
if (elt.getTagName().equals("ELEMENT1")) {
return FILTER_SKIP;
}
return FILTER_ACCEPT;
}
public short acceptNode(Node enode) {
return FILTER_ACCEPT;
}
public int getWhatToShow() {
return NodeFilter.SHOW_ALL;
}
}
);
Document parsedDoc = dp.parse(src);
DOMSerializer ser = implLS.createDOMSerializer();
System.out.println("After parsing: "+ser.writeToString(parsedDoc));
}
}
------- end-of-Test.java -------
Minimized test output:
======================
Before parsing: <?xml version="1.0"?><ROOT><ELEMENT1><CHILD1/><CHILD2/></ELEMENT1></ROOT>
After parsing: <?xml version="1.0"?><ROOT><CHILD1><CHILD2/></CHILD1></ROOT>
JCK test source location:
==========================
/java/re/jck/1.5/promoted/latest/JCK-runtime-15/tests
Specific Machine Info:
=====================
SunOS orion 5.9 Generic_112233-03 sun4u sparc SUNW,Ultra-Enterprise
======================================================================
Filed By : SPB JCK team (###@###.###)
JDK : java full version "1.5.0-beta-b20"
JCK : 1.5
Platform[s] : Solaris
switch/Mode :
JCK test owner : http://javaweb.eng/jct/sqe/JCK-tck/usr/owners.jto
Failing Test [s] : N/A
Problem description
===================
If DOMParser uses a filter, skipping one element, that has two children, then it
constructs wrong DOM structure. For example, if we shall skip element node <ELEMENT1>, using
FILTER_SKIP flag, for following XML:
<ROOT><ELEMENT1><CHILD1/><CHILD2/></ELEMENT1></ROOT>
after parsing we'll get:
<ROOT><CHILD1><CHILD2/></CHILD1></ROOT>
This behavior isn't described in the Java API Spec.
Minimized test:
===============
------- Test.java -------
import java.io.*;
import org.w3c.dom.ls.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.w3c.dom.traversal.*;
public class Test {
public static void main(String[] argv) {
String xml = "<?xml version=\"1.0\"?><ROOT><ELEMENT1><CHILD1/><CHILD2/></ELEMENT1></ROOT>";
System.out.println("Before parsing: "+xml);
DocumentBuilder parser = null;
Document doc = null;
try {
parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
doc = parser.parse(new StringBufferInputStream(xml));
} catch (Throwable e) {
e.printStackTrace();
}
DOMImplementationLS implLS = (DOMImplementationLS) doc.getImplementation().getFeature("LS","3.0");
DOMParser dp = implLS.createDOMParser(DOMImplementationLS.MODE_SYNCHRONOUS,null);
DOMInput src = implLS.createDOMInput();
src.setStringData(xml);
dp.setFilter(
new DOMParserFilter() {
public short startElement(Element elt) {
if (elt.getTagName().equals("ELEMENT1")) {
return FILTER_SKIP;
}
return FILTER_ACCEPT;
}
public short acceptNode(Node enode) {
return FILTER_ACCEPT;
}
public int getWhatToShow() {
return NodeFilter.SHOW_ALL;
}
}
);
Document parsedDoc = dp.parse(src);
DOMSerializer ser = implLS.createDOMSerializer();
System.out.println("After parsing: "+ser.writeToString(parsedDoc));
}
}
------- end-of-Test.java -------
Minimized test output:
======================
Before parsing: <?xml version="1.0"?><ROOT><ELEMENT1><CHILD1/><CHILD2/></ELEMENT1></ROOT>
After parsing: <?xml version="1.0"?><ROOT><CHILD1><CHILD2/></CHILD1></ROOT>
JCK test source location:
==========================
/java/re/jck/1.5/promoted/latest/JCK-runtime-15/tests
Specific Machine Info:
=====================
SunOS orion 5.9 Generic_112233-03 sun4u sparc SUNW,Ultra-Enterprise
======================================================================
- backported by
-
JDK-2116264 Implementation of org.w3c.dom.ls.DOMParser changes structure of XML document
-
- Closed
-