How can we write case insensitive queries for Xpath xml parsing
Please follow the given xml code below.
Consider a xml file with parameter and values like
<Book>
<Name>ABC</NAME>
<Value>123</Value>
</Book>
<book>
<Name>EFG</Name>
<Value>456</Value>
</book>
<bOOK>
<Name>XYZ</Name>
<Value>789</Name>
</bOOK>
In Java,
How can we write a single Xpath query to parse all the book blocks in single expression though they are in different case(Upper case/Lowercase).
Please let me know if anybody can help me with this.
Regards,
Vijay
Re: How can we write case insensitive queries for Xpath xml parsing
XPath is used to query well formed XML documents. Your XML isn't well formed, so I'm not sure you can use XPath here.
- petter
Re: How can we write case insensitive queries for Xpath xml parsing
Please note: Updating the xml code correctly
<config>
<Book>
<Name>ABC</Name>
<Value>123</Value>
</Book>
<book>
<Name>EFG</Name>
<Value>456</Value>
</book>
<bOOK>
<Name>XYZ</Name>
<Value>789</Value>
</bOOK>
</config>
Regards,
Vijay
Re: How can we write case insensitive queries for Xpath xml parsing
Assuming the XML is well-formed, this expression will find all nodes whose lowercase name is 'book':
//.[lower-case(name())='book']
The key to performance is elegance, not batallions of special cases...
J. Bently & D. McIlroy
Re: How can we write case insensitive queries for Xpath xml parsing
Please see the result of the modification, I am getting some errors, What might be the cause
XPathExpression bookexp = xpath.compile("//[lower-case(name())='book']/Name/text()");
Object obj = bookexp.evaluate(doc, XPathConstants.NODESET);
Output:
Exception in thread "main" javax.xml.transform.TransformerException: A location step was expected following the '/' or '//' token.
at com.sun.org.apache.xpath.internal.compiler.XPathParser.error(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.Step(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelativeLocationPath(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.LocationPath(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.PathExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnionExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnaryExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.MultiplicativeExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.AdditiveExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelationalExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.OrExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.Expr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.initXPath(Unknown Source)
at com.sun.org.apache.xpath.internal.XPath.<init>(Unknown Source)
at com.sun.org.apache.xpath.internal.XPath.<init>(Unknown Source)
at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.compile(Unknown Source)
at Gts.query(Gts.java:38)
at Gts.main(Gts.java:46)
Re: How can we write case insensitive queries for Xpath xml parsing
You didn't copy the expression I posted. Look again (or just copy & paste).
Everything should be made as simple as possible, but not simpler...
A. Einstein
Re: How can we write case insensitive queries for Xpath xml parsing
Hi...
Please see the result of the expression posted by you.
bookexp = xpath.compile("//.[lower-case(name())='book']");
Object obj = bookexp.evaluate(doc, XPathConstants.NODESET);
Please view the full code.
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Gts {
public void query() throws ParserConfigurationException, SAXException,
IOException, XPathExpressionException {
// Standard of reading a XML file
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder;
Document doc = null;
//Expression variables to check xml parameters
XPathExpression bookexp = null; // Expression to parse global parameters names
XPathFactory xFactory = XPathFactory.newInstance();
// Create a XPath object
XPath xpath = xFactory.newXPath();
// Compile the XPath expression
builder = factory.newDocumentBuilder();
doc = builder.parse("c:/book.xml");
bookexp = xpath.compile("//.[lower-case(name())='book']");
Object obj = bookexp.evaluate(doc, XPathConstants.NODESET);
NodeList n = (NodeList) obj;
for (int i=0; i<n.getLength(); i++)
System.out.println(n.item(i).getNodeValue());
}
public static void main(String[] args) throws XPathExpressionException, ParserConfigurationException, SAXException, IOException {
Gts g = new Gts();
g.query();
}
}
Please let me know if any modifications.
Output:
Exception in thread "main" javax.xml.transform.TransformerException: '..[predicate]' or '.[predicate]' is illegal syntax. Use 'self::node()[predicate]' instead.
at com.sun.org.apache.xpath.internal.compiler.XPathParser.error(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.Step(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelativeLocationPath(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.LocationPath(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.PathExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnionExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnaryExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.MultiplicativeExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.AdditiveExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelationalExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.OrExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.Expr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.initXPath(Unknown Source)
at com.sun.org.apache.xpath.internal.XPath.<init>(Unknown Source)
at com.sun.org.apache.xpath.internal.XPath.<init>(Unknown Source)
at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.compile(Unknown Source)
at Gts.query(Gts.java:38)
at Gts.main(Gts.java:46)
Re: How can we write case insensitive queries for Xpath xml parsing
The expression worked fine for me on the sample XML you provided. If it doesn't work for you, why not try the suggestion in the error message?
The purpose of computing is insight, not numbers...
R. Hamming