You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xmlbeans.apache.org by "Coram Bryant (JIRA)" <xm...@xml.apache.org> on 2007/02/15 01:10:05 UTC

[jira] Created: (XMLBEANS-313) Whitespace in document causes unexpected XPath behavior

Whitespace in document causes unexpected XPath behavior
-------------------------------------------------------

                 Key: XMLBEANS-313
                 URL: https://issues.apache.org/jira/browse/XMLBEANS-313
             Project: XMLBeans
          Issue Type: Bug
          Components: XPath
         Environment: Microsoft Windows XP Professional Version 2002 (Service Pack 2)
Pentium 4 CPU 3.00GHz, 2.00 GB of RAM
            Reporter: Coram Bryant


There is a bug in XmlBeans whereby the existence of whitespace in a document, wherein the elements are in a default namespace, causes unexpected XPath results.  There are various ways in which this can be manifested (some more difficult to reproduce than others).  The following code demonstrates a simple condition in which this can be seen, as well as similar conditions in which the bug is not manifested.

In short, the following condition causes an invalid XPath:

1) The document has a default namespace
2) There are pair of siblings, the first of which is preceded by whitespace
3) In the context of the first sibling (in document order), the XPath expression "following-sibling::*[1]" yields the first sibling (rather than the second sibling, as would be expected).

                try 
                {
			String xml;
			XmlObject xmlObject;
			XmlObject[] results;
			
			// This XML snippet contains a whitespace character before the child1 element.
                        // There is a default namespace.
                        // These conditions will yield the bug
			xml = "<root xmlns='http://some_ns'> <child1/><child2/></root>";
			xmlObject = XmlObject.Factory.parse(xml);
			results = xmlObject.selectPath("declare namespace sn='http://some_ns'; /sn:root/sn:child1/following-sibling::*[1]/name()");
			System.out.println(results[0].xmlText()); // Prints <xml-fragment>child2</xml-fragment>
			
			// This is the case that yields incorrect results
                        // Note that the context element must be the first sibling in order to yield the bug.
                        // The bug does not manifest itself if the XPath expression is evaluated from an ancestor, as shown above.
			results = xmlObject.selectPath("declare namespace sn='http://some_ns'; /sn:root/sn:child1");
			results = results[0].selectPath("declare namespace sn='http://some_ns'; following-sibling::*[1]/name()");
			System.out.println(results[0].xmlText()); // Prints <xml-fragment>child1</xml-fragment>
			
			
			// This XML snippet contains no whitespace characters.
			// There is a default namespace.
                        // This condition does not cause the bug
    		        xml = "<root xmlns='http://some_ns'><child1/><child2/></root>";
			xmlObject = XmlObject.Factory.parse(xml);
			results = xmlObject.selectPath("declare namespace sn='http://some_ns'; /sn:root/sn:child1/following-sibling::*[1]/name()");
			System.out.println(results[0].xmlText()); // Prints <xml-fragment>child2</xml-fragment>
			
			results = xmlObject.selectPath("declare namespace sn='http://some_ns'; /sn:root/sn:child1");
			results = results[0].selectPath("declare namespace sn='http://some_ns'; following-sibling::*[1]/name()");
			System.out.println(results[0].xmlText()); // Prints <xml-fragment>child2</xml-fragment>

			
			// This XML Snippet contains a whitespace character before the child1 element.
			// There is no namespace.
                        // This condition does not cause the bug
			xml = "<root> <child1/><child2/></root>";
			xmlObject = XmlObject.Factory.parse(xml);
			results = xmlObject.selectPath("/root/child1/following-sibling::*[1]/name()");
			System.out.println(results[0].xmlText()); // Prints <xml-fragment>child2</xml-fragment>
			
			results = xmlObject.selectPath("/root/child1");
			results = results[0].selectPath("following-sibling::*[1]/name()");
			System.out.println(results[0].xmlText());  // Prints <xml-fragment>child2</xml-fragment>
		} 
                catch (XmlException e) 
    	        {
			e.printStackTrace();
		}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: dev-help@xmlbeans.apache.org


[jira] Assigned: (XMLBEANS-313) Whitespace in document causes unexpected XPath behavior

Posted by "Wing Yew Poon (JIRA)" <xm...@xml.apache.org>.
     [ https://issues.apache.org/jira/browse/XMLBEANS-313?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Wing Yew Poon reassigned XMLBEANS-313:
--------------------------------------

    Assignee: Wing Yew Poon

> Whitespace in document causes unexpected XPath behavior
> -------------------------------------------------------
>
>                 Key: XMLBEANS-313
>                 URL: https://issues.apache.org/jira/browse/XMLBEANS-313
>             Project: XMLBeans
>          Issue Type: Bug
>          Components: XPath
>         Environment: Microsoft Windows XP Professional Version 2002 (Service Pack 2)
> Pentium 4 CPU 3.00GHz, 2.00 GB of RAM
>            Reporter: Coram Bryant
>            Assignee: Wing Yew Poon
>
> There is a bug in XmlBeans whereby the existence of whitespace in a document, wherein the elements are in a default namespace, causes unexpected XPath results.  There are various ways in which this can be manifested (some more difficult to reproduce than others).  The following code demonstrates a simple condition in which this can be seen, as well as similar conditions in which the bug is not manifested.
> In short, the following condition causes an invalid XPath:
> 1) The document has a default namespace
> 2) There are pair of siblings, the first of which is preceded by whitespace
> 3) In the context of the first sibling (in document order), the XPath expression "following-sibling::*[1]" yields the first sibling (rather than the second sibling, as would be expected).
>                 try 
>                 {
> 			String xml;
> 			XmlObject xmlObject;
> 			XmlObject[] results;
> 			
> 			// This XML snippet contains a whitespace character before the child1 element.
>                         // There is a default namespace.
>                         // These conditions will yield the bug
> 			xml = "<root xmlns='http://some_ns'> <child1/><child2/></root>";
> 			xmlObject = XmlObject.Factory.parse(xml);
> 			results = xmlObject.selectPath("declare namespace sn='http://some_ns'; /sn:root/sn:child1/following-sibling::*[1]/name()");
> 			System.out.println(results[0].xmlText()); // Prints <xml-fragment>child2</xml-fragment>
> 			
> 			// This is the case that yields incorrect results
>                         // Note that the context element must be the first sibling in order to yield the bug.
>                         // The bug does not manifest itself if the XPath expression is evaluated from an ancestor, as shown above.
> 			results = xmlObject.selectPath("declare namespace sn='http://some_ns'; /sn:root/sn:child1");
> 			results = results[0].selectPath("declare namespace sn='http://some_ns'; following-sibling::*[1]/name()");
> 			System.out.println(results[0].xmlText()); // Prints <xml-fragment>child1</xml-fragment>
> 			
> 			
> 			// This XML snippet contains no whitespace characters.
> 			// There is a default namespace.
>                         // This condition does not cause the bug
>     		        xml = "<root xmlns='http://some_ns'><child1/><child2/></root>";
> 			xmlObject = XmlObject.Factory.parse(xml);
> 			results = xmlObject.selectPath("declare namespace sn='http://some_ns'; /sn:root/sn:child1/following-sibling::*[1]/name()");
> 			System.out.println(results[0].xmlText()); // Prints <xml-fragment>child2</xml-fragment>
> 			
> 			results = xmlObject.selectPath("declare namespace sn='http://some_ns'; /sn:root/sn:child1");
> 			results = results[0].selectPath("declare namespace sn='http://some_ns'; following-sibling::*[1]/name()");
> 			System.out.println(results[0].xmlText()); // Prints <xml-fragment>child2</xml-fragment>
> 			
> 			// This XML Snippet contains a whitespace character before the child1 element.
> 			// There is no namespace.
>                         // This condition does not cause the bug
> 			xml = "<root> <child1/><child2/></root>";
> 			xmlObject = XmlObject.Factory.parse(xml);
> 			results = xmlObject.selectPath("/root/child1/following-sibling::*[1]/name()");
> 			System.out.println(results[0].xmlText()); // Prints <xml-fragment>child2</xml-fragment>
> 			
> 			results = xmlObject.selectPath("/root/child1");
> 			results = results[0].selectPath("following-sibling::*[1]/name()");
> 			System.out.println(results[0].xmlText());  // Prints <xml-fragment>child2</xml-fragment>
> 		} 
>                 catch (XmlException e) 
>     	        {
> 			e.printStackTrace();
> 		}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: dev-help@xmlbeans.apache.org