Support Wikipedia Follow My Heart: 三月 2012

2012年3月19日星期一

XPath 遇到 命名空间(Namespace)

今天在一个拥有命名空间设定的xml文件上用xpath查节点,发现怎么写xpath语句都查不到对应的东西,总是返回null.仔细google一下,发现原来是命名空间的问题。

对于一个没有命名空间的xml文件,比如:

no namespace

<?xml version="1.0"?>
<project>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>project</artifactId>
    <name>example</name>
    <url>http://maven.apache.org</url>
    <version>1.1.0</version>
</project>


如下的xpath语句可以顺利执行,并得到预想的结果。


no namespace xpath


root.selectSingleNode("//version") // 获得version 节点

然而,加入命名空间后,这两个xpath的返回值都变成null。


namespace xml

仔细分析,发现新的xml文件中,有两组命名空间,分别是前缀为 ”xsi”的空间(url=http://www.w3.org/2001/XMLSchema-instance)和无前缀的默认空间(url=http://maven.apache.org/POM/4.0.0)。 因此,当调用xpath语句时,候选节点自动根据命名空间进行了过滤,即:









当xpath中未指定命名空间,如”//version”搜索范围是所有不属于任何命名空间的节点。但是在该例中由于存在默认命名空间,所以这里什么都找不到。
当xpath中指定命名空间前缀时,如”xsi”搜索范围是所有隶属于xsi命名空间的节点,也就是以xsi: 开头的节点及其子节点。


因此,为了顺利查找得到隶属于默认无前缀命名空间的version节点,我们需要:



  1. 将默认无前缀命名空间改为有前缀的命名空间。

  2. 将新的前缀名加入到查找所用到的xpath语句中。

代码如下:


java

2012年3月9日星期五

Eclipse 远程调试 java程序

今天一个偶然的机会,研究了一下用eclipse调试远程java程序。

具体操作如下:

Step1: 配置远程被调试的java程序的启动参数(JVM参数),打开远程debug监听端口。

Step2: 启动远程java程序.(注意,配置完参数后,一定要先把这个远程java程序run起来。如果是在eclipse中启动,要用run方式,不是debug方式。)所要用到的参数如下:

VM Parameter


Step3: 在本地的eclispe中创建用于远程调试的debug profile。具体过程如下:

 

step1 

Step2

step3

step4

 

Then you can debug your code remotely as follows.

Note: the remote Java Code will be suspended as soon as it is started (‘cause you set “suspend=y” in VM arguments). When you start “debug” in your local Eclipse, the remove JVM will resume running until meet the first Breakpoint.

注意端口,地址,编码,代码,JRE环境等等因素的匹配问题。

 

final

Wish you enjoy it!