0

我有一个 XmlParserClass 从看起来像这样的 xml 文件中获取值。

<?xml version="1.0" encoding="utf-8" ?>
<HomePageData>
<LogoTopLeft>//*[@id='corp_logo']</LogoTopLeft>
<SingInLink>//*[@id='login']</SingInLink>
<SingUpLink>//*[@id='signup']</SingUpLink>
</HomePageData>

我的类文件中的方法如下所示:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(file);
XPath xp = XPathFactory.newInstance().newXPath();
try{
        String value = xp.evaluate("/LogoTopLeft/text()", doc); 
        return value;
    } catch(XPathExpressionException e)
    {
        return null;
    }

我无法使用此类文件从 xml 文件中获取预期数据。它刚刚到达 try 块,然后到达 catch 以返回“null”。stackoverflow 中的大多数问题都已通过 for 循环收集所有节点来回答,但我需要一次获取一个数据,而不是一次获取所有元素,此外,我需要将此值返回到另一个仅接受的类文件字符串,所以我不能传递 NodeList 或任何其他元素

PS - xml 文件存在于 parsefile 以外的不同位置。我将类路径值“/projName/src/com/core/path/indexPage.xml”存储在一个文件中并传递了它。

4

1 回答 1

2

您只需要修复您的 XPath。/LogoTopLeft正在寻找 XML 根的元素,而它是一个子元素。因此,使用//LogoTopLeft或指定完整路径为/HomePageData/LogoTopLeft

String logo = xp.evaluate("//LogoTopLeft/text()", doc);
String signIn = xp.evaluate("//SignInLink/text()", doc);
String signUp = xp.evaluate("//SignUpLink/text()", doc);

System.out.println( "logo = " + logo +
                    "; signIn = " + signIn +
                    "; signUp = " + signUp);
/* prints:
   logo = //*[@id='corp_logo']; signIn = //*[@id='login']; signUp = //*[@id='signup']
*/

编辑:(我的测试代码)

Document doc = DocumentBuilderFactory.newInstance()
                   .newDocumentBuilder().parse(new File("input.xml"));

XPath xp = XPathFactory.newInstance().newXPath();

try {
    String logo = xp.evaluate("/HomePageData/LogoTopLeft/text()", doc);
    String signIn = xp.evaluate("//SignInLink/text()", doc);
    String signUp = xp.evaluate("//SignUpLink/text()", doc);

    System.out.println( "logo = " + logo +
                        "; signIn = " + signIn +
                        "; signUp = " + signUp);
} catch (XPathExpressionException e) {
    e.printStackTrace();
}

input.xml(放置在项目目录中)

<?xml version="1.0" encoding="utf-8" ?>
<HomePageData>
    <LogoTopLeft>//*[@id='corp_logo']</LogoTopLeft>
    <SignInLink>//*[@id='login']</SignInLink>
    <SignUpLink>//*[@id='signup']</SignUpLink>
</HomePageData>
于 2013-08-15T13:51:02.617 回答