Details
-
Bug
-
Resolution: Fixed
-
P4
-
8, 9, 10, 11
-
b07
-
x86_64
-
windows_10
Description
ADDITIONAL SYSTEM INFORMATION :
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)
A DESCRIPTION OF THE PROBLEM :
This was previously reported asJDK-8025660 and JDK-4762733 but I believe that the resolution was incorrect. Calling DocumentBuilderFactory.setExpandEntityReferences(false) does indeed cause an EntityReference node to appear in the DOM, but a Text node containing the expanded text also appears as the next sibling. This text node is unexpected based on the Javadoc for DocumentBuilderFactory.setExpandEntityReferences.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
See test case below. Call DocumentBuilderFactory.setExpandEntityReferences(false) then parse an XML file with an entity reference.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Only the EntityReference node should be present in the DOM
ACTUAL -
The EntityReference node is present, along with a sibling Text node containing the expanded entity value.
---------- BEGIN SOURCE ----------
DocumentBuilderFactoryTest.java:
import java.io.File;
import java.io.FileInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DocumentBuilderFactoryTest
{
private static final String XML_DIR = ".";
/**
* Test the setExpandEntityReferences.
* @throws Exception If any errors occur.
*/
@Test
public void testCheckDocumentBuilderFactory08() throws Exception {
try (FileInputStream fis = new FileInputStream(new File(
XML_DIR, "DocumentBuilderFactory02.xml"))) {
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
final DocumentBuilder docBuilder = dbf.newDocumentBuilder();
final Document doc = docBuilder.parse(fis);
final Element e = (Element) doc.getElementsByTagName("title").item(0);
final NodeList nl = e.getChildNodes();
Assert.assertTrue(nl.item(0) instanceof EntityReference);
Assert.assertNull(nl.item(0).getNodeValue());
// Should be just 1 EntityReference node, but a Text node also is present
Assert.assertEquals(nl.getLength(), 1);
}
}
}
DocumentBuilderFactory02.xml:
<?xml version="1.0"?>
<!DOCTYPE document [
<!ENTITY ws "Wiliam SHAkespeare">
<!ELEMENT document (title)>
<!ELEMENT title (#PCDATA)>
]>
<document>
<title>&ws;</title>
</document>
---------- END SOURCE ----------
FREQUENCY : always
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)
A DESCRIPTION OF THE PROBLEM :
This was previously reported as
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
See test case below. Call DocumentBuilderFactory.setExpandEntityReferences(false) then parse an XML file with an entity reference.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Only the EntityReference node should be present in the DOM
ACTUAL -
The EntityReference node is present, along with a sibling Text node containing the expanded entity value.
---------- BEGIN SOURCE ----------
DocumentBuilderFactoryTest.java:
import java.io.File;
import java.io.FileInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DocumentBuilderFactoryTest
{
private static final String XML_DIR = ".";
/**
* Test the setExpandEntityReferences.
* @throws Exception If any errors occur.
*/
@Test
public void testCheckDocumentBuilderFactory08() throws Exception {
try (FileInputStream fis = new FileInputStream(new File(
XML_DIR, "DocumentBuilderFactory02.xml"))) {
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
final DocumentBuilder docBuilder = dbf.newDocumentBuilder();
final Document doc = docBuilder.parse(fis);
final Element e = (Element) doc.getElementsByTagName("title").item(0);
final NodeList nl = e.getChildNodes();
Assert.assertTrue(nl.item(0) instanceof EntityReference);
Assert.assertNull(nl.item(0).getNodeValue());
// Should be just 1 EntityReference node, but a Text node also is present
Assert.assertEquals(nl.getLength(), 1);
}
}
}
DocumentBuilderFactory02.xml:
<?xml version="1.0"?>
<!DOCTYPE document [
<!ENTITY ws "Wiliam SHAkespeare">
<!ELEMENT document (title)>
<!ELEMENT title (#PCDATA)>
]>
<document>
<title>&ws;</title>
</document>
---------- END SOURCE ----------
FREQUENCY : always
Attachments
Issue Links
- csr for
-
JDK-8216531 Change DOM parser to not produce a Text node with DocumentBuilderFactory.setExpandEntityReferences(false)
- Closed
- relates to
-
JDK-4762733 Method setExpandEntityReferences of Object DocumentBuilderFactory has no effects
- Closed