[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xmlbeans-dev
Subject:    [jira] Created: (XMLBEANS-313) Whitespace in document causes
From:       "Coram Bryant (JIRA)" <xmlbeans-dev () xml ! apache ! org>
Date:       2007-02-15 0:10:05
Message-ID: 2560372.1171498205676.JavaMail.jira () brutus
[Download RAW message or body]

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


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic