Parse with XPathTag(s): XML
[J2SE 1.5]
Consider the following XML data file (howto.xml)
<?xml version="1.0"?>
<howto>
<topic name="Java">
<url>http://www.rgagnon.com/topics/java-xml.html</url>
</topic>
<topic name="PowerBuilder">
<url>http://www.rgagnon.com/topics/pb-common.html</url>
<url>http://www.rgagnon.com/topics/pb-pfc.html</url>
</topic>
<topic name="Javascript">
<url>http://www.rgagnon.com/topics/js-language.html</url>
</topic>
<topic name="VBScript">
<url>http://www.rgagnon.com/topics/wsh-vbs.html</url>
</topic>
</howto>
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
public class SimpleXPath {
public static void main(String[] args) throws Exception {
XPath xpath = XPathFactory.newInstance().newXPath();
String xpathExpression = "/howto/topic/@name";
InputSource inputSource = new InputSource("howto.xml");
NodeList nodes = (NodeList) xpath.evaluate
(xpathExpression, inputSource, XPathConstants.NODESET);
int j = nodes.getLength();
for (int i = 0; i < j; i++) {
System.out.println(nodes.item(i).getTextContent());
}
/*
output :
Java
PowerBuilder
Javascript
VBScript
*/
}
}
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
public class SimpleXPath2 {
public static void main(String[] args) throws Exception {
XPath xpath = XPathFactory.newInstance().newXPath();
String topicExpression = "/howto/topic[@name='PowerBuilder']";
InputSource inputSource = new InputSource("howto.xml");
// get nodes with the topic PowerBuilder
NodeList nodes = (NodeList) xpath.evaluate
(topicExpression, inputSource, XPathConstants.NODESET);
// output the text content of this node and its descendants.
// (includes empty LF because of empty comment (#text))
System.out.println(nodes.item(0).getTextContent());
/*
output :
http://www.rgagnon.com/topics/pb-common.html
http://www.rgagnon.com/topics/pb-pfc.html
*/
// display only the "url" nodes for PowerBuidler
NodeList urls = nodes.item(0).getChildNodes();
int j = urls.getLength();
for (int i = 0; i < j ; i++) {
if (urls.item(i).getNodeName().equals("url")) {
System.out.println("url :" + urls.item(i).getTextContent());
}
}
/*
output :
url :http://www.rgagnon.com/topics/pb-common.html
url :http://www.rgagnon.com/topics/pb-pfc.html
*/
}
}If your XML is in a String (not in a File) then you need to get an InputStream from it.
import java.io.ByteArrayInputStream;
import java.io.InputStream;
...
String xml = "<?xml version="1.0"?>"
+ " <howto>"
+ " <topic name="Java">"
...
+ "</howto>";
InputStream is = new ByteArrayInputStream(xml.getBytes());
XPath xpath = XPathFactory.newInstance().newXPath();
String xpathExpression = "/howto/topic[@name='PowerBuilder']";
InputSource inputSource = new InputSource(is);
NodeList nodes = (NodeList) xpath.evaluate
(topicExpression, inputSource, XPathConstants.NODESET);
...
Consider this XML :
<?xml version="1.0" encoding="UTF-8"?>
<UDSObjectList>
<UDSObject>
<Handle>chg_tpl:400004</Handle>
<Attributes>
<Attribute DataType="2001">
<AttrName>id</AttrName>
<AttrValue>400004</AttrValue>
</Attribute>
<Attribute DataType="2002">
<AttrName>persistent_id</AttrName>
<AttrValue>chg_tpl:400004</AttrValue>
</Attribute>
</Attributes>
</UDSObject>
</UDSObjectList>
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import org.xml.sax.InputSource;
...
String xml = "<?xml version="1.0" encoding="UTF-8"?>"
+ "<UDSObjectList>"
...
+ "</UDSObjectList>";
...
InputStream is = new ByteArrayInputStream(xml.getBytes("UTF8"));
XPath xpath = XPathFactory.newInstance().newXPath();
String xpathExpression = "/UDSObjectList/UDSObject/Handle";
InputSource inputSource = new InputSource(is);
String handle = xpath.evaluate(xpathExpression, inputSource);
System.out.println(handle);
/*
output :
chg_tpl:400004
*/
One last example. Suppose we have an XML file containing SQL Statements.
<queries>
<query id="getUserByName">select * from users where name=?</query>
<query id="getUserByEmail">select * from users where email=?</query>
</queries>
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import org.xml.sax.InputSource;
public class Test {
public static void main(String[] args) throws Exception {
System.out.println(getQuery("getUserByName"));
System.out.println(getQuery("getUserByEmail"));
}
public static String getQuery (String id) throws Exception {
XPath xpath = XPathFactory.newInstance().newXPath();
// in this example, sql.xml is loaded from the classpath
InputSource is = new InputSource(Test.class.getResourceAsStream("/sql.xml"));
return xpath.evaluate("/queries/query[@id='" + id +"']", is);
}
}
/* output :
select * from users where name=?
select * from users where email=?
*/
mail_outline
Send comment, question or suggestion to howto@rgagnon.com
Send comment, question or suggestion to howto@rgagnon.com