通常我们使用xml解析的时候都是通过一层层遍历的形式进行解析,那样在对于知道指定属性是的解析效率很低。XPath解析技术是直接解析到指定路径的一个解析方式,方便高效,XPath非常类似对数据库操作的SQL语言,或者说JQuery,它可以方便开发者抓起文档中需要的东西。
话不多说,直接上代码:
1、XML格式如下: 屏幕空间有限,后面的尾部</>请自行恶补...
2、使用xpath进行解析:以下是必备的几个引用包,若是使用类似于DOM4使用XPath则另说:
3、解析
private final String INPUTFORMAT_XPATH = "//InputFormat"; //直接指定到特定路径,不用遍历去查找
private final String PROCEDURE_XPATH = "//IndexDataProcess/Procedures/Procedure"; //直接指定到特定路径,不用遍历去查找
private final String PROCEDURES_COLLECTION_XPATH = "//ProceduresCollection"; //直接指定到特定路径,不用遍历去查找
public Processor( String configFile) //此方法xml的路径传入进行解析
{
XPathFactory xpathFactory = XPathFactory.newInstance(); //创建xpath工厂实例
XPath xpath = xpathFactory.newXPath(); //工厂创建xpath实例
try {
//定位到节点,在configFile文件中找到INPUTFORMAT_XPATH路径的这个XPathConstants.NODE节点
Node inFormatNode = (Node) xpath.evaluate(INPUTFORMAT_XPATH,
new InputSource(configFile), XPathConstants.NODE);
//XPathConstants.NODEXPathConstants.NODE节点获取属性只能通过getAttributes();
NamedNodeMap inFormatAtts = inFormatNode.getAttributes();
//得到此节点内的CLASS名称属性再getNodeValue()获取到此名称属性的值
String inFormatCName = inFormatAtts.getNamedItem(CLASS).getNodeValue();
Class inFormatClass = Class.forName(inFormatCName);
inputFormat = (InputFormat) inFormatClass.newInstance(); //实例化此类的一个对象
inputFormat.init( inFormatNode); //调用init(Node node)方法
}
//*********************************************************************************************************//
init(Node node){ //以下的代码我就不一一解释注释了,跟上面方法差不多,只是进一步解析node节点,
if (node != null) {
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
try {
Node MQSNode = (Node) xpath.evaluate("MQS", node, XPathConstants.NODE);
NodeList MQSNodeList = (NodeList) xpath.evaluate("String", MQSNode, XPathConstants.NODESET);
if (MQSNodeList != null) {
this.mq_info = new HashMap<String, String>(MQSNodeList.getLength());
for (int i = 0; i < MQSNodeList.getLength(); i++) {
NamedNodeMap attributes = MQSNodeList.item(i).getAttributes();
String name = attributes.getNamedItem(FIELD_NAME).getNodeValue().trim(); //获取到了对应节点的FIELD_NAME值
String value = attributes.getNamedItem(FIELD_VALUE).getNodeValue().trim(); //获取到了对应节点的FIELD_VALUE值
}
}
}
为了能很好的注释解释清楚,我直接把代码复制上来而不是用图直接粘贴,我也是够拼的...........