// it used to be regarded as MS bug but it was not really. public void TestPreserveEntityNotOnDotNet() { string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>"; string dtd = "<!DOCTYPE root [" + intSubset + "]>"; string xml = dtd + "<root foo='&ent;' bar='internal &ent; value' />"; dvr = PrepareXmlReader(xml); dvr.EntityHandling = EntityHandling.ExpandCharEntities; dvr.Read(); // DTD dvr.Read(); Assert.AreEqual(XmlNodeType.Element, dvr.NodeType); Assert.AreEqual("root", dvr.Name); Assert.IsTrue(dvr.MoveToFirstAttribute()); Assert.AreEqual("foo", dvr.Name); Assert.AreEqual("entity string", dvr.Value); // ReadAttributeValue() Assert.IsTrue(dvr.ReadAttributeValue()); Assert.AreEqual(XmlNodeType.EntityReference, dvr.NodeType); Assert.AreEqual("ent", dvr.Name); Assert.AreEqual(String.Empty, dvr.Value); Assert.IsTrue(!dvr.ReadAttributeValue()); // bar Assert.IsTrue(dvr.MoveToNextAttribute()); Assert.AreEqual("bar", dvr.Name); Assert.AreEqual("internal entity string value", dvr.Value); // ReadAttributeValue() Assert.IsTrue(dvr.ReadAttributeValue()); Assert.AreEqual(XmlNodeType.Text, dvr.NodeType); Assert.AreEqual(String.Empty, dvr.Name); Assert.AreEqual("internal ", dvr.Value); Assert.IsTrue(dvr.ReadAttributeValue()); Assert.AreEqual(XmlNodeType.EntityReference, dvr.NodeType); Assert.AreEqual("ent", dvr.Name); Assert.AreEqual(String.Empty, dvr.Value); Assert.IsTrue(dvr.ReadAttributeValue()); Assert.AreEqual(XmlNodeType.Text, dvr.NodeType); Assert.AreEqual(String.Empty, dvr.Name); Assert.AreEqual(" value", dvr.Value); // ValidationType = None dvr = PrepareXmlReader(xml); dvr.EntityHandling = EntityHandling.ExpandCharEntities; dvr.ValidationType = ValidationType.None; dvr.Read(); // DTD dvr.Read(); Assert.AreEqual(XmlNodeType.Element, dvr.NodeType); Assert.AreEqual("root", dvr.Name); // foo Assert.IsTrue(dvr.MoveToFirstAttribute()); Assert.AreEqual("foo", dvr.Name); Assert.AreEqual("entity string", dvr.Value); // ReadAttributeValue() Assert.IsTrue(dvr.ReadAttributeValue()); Assert.AreEqual(XmlNodeType.EntityReference, dvr.NodeType); Assert.AreEqual("ent", dvr.Name); Assert.AreEqual(String.Empty, dvr.Value); Assert.IsTrue(!dvr.ReadAttributeValue()); // bar Assert.IsTrue(dvr.MoveToNextAttribute()); Assert.AreEqual("bar", dvr.Name); Assert.AreEqual("internal entity string value", dvr.Value); // ReadAttributeValue() Assert.IsTrue(dvr.ReadAttributeValue()); Assert.AreEqual(XmlNodeType.Text, dvr.NodeType); Assert.AreEqual(String.Empty, dvr.Name); Assert.AreEqual("internal ", dvr.Value); Assert.IsTrue(dvr.ReadAttributeValue()); Assert.AreEqual(XmlNodeType.EntityReference, dvr.NodeType); Assert.AreEqual("ent", dvr.Name); Assert.AreEqual(String.Empty, dvr.Value); Assert.IsTrue(dvr.ReadAttributeValue()); Assert.AreEqual(XmlNodeType.Text, dvr.NodeType); Assert.AreEqual(String.Empty, dvr.Name); Assert.AreEqual(" value", dvr.Value); }