使用Apache Commons Configuration Xpath查询带有属性的空XML元素

5
我将使用apache commons configuration XMLConfiguration对象与XPATH表达式引擎来查询XML文件。我对xpath和apache commons还不熟悉,所以在语法方面遇到了些问题。
XML文件的格式如下:
<attrs>
    <attr name="my_name" val="the_val"/>
    <attr name="my_name2" val="the_val2"/>
</attrs>

我想要做的基本上就是通过commons循环遍历所有属性,并读取每一行的名称和值。我找到的唯一方法是使用name的值再次查询xml来抓取所有内容。这种感觉对我来说似乎不太对,是否有更好的方法来解决?

List<String> names = config.getList("attrs/attr/@name");
for( String name : names )
{
    String val = config.getString("attrs/attr[@name='" +name +"']/@val" );
    System.out.println("name:" +name +"   VAL:" +val);
}

此外,关于将其转换为字符串的问题,我不确定处理方式是否正确。

尝试使用 attrs/attr/@name | //attr/@val - RanRag
这个代码获取了所有的值,但是以长字符串列表的形式呈现,先是所有的名称,然后是所有的值。虽然它们是有序的,但是你可能需要进行一些数学计算,比如val_pos = size()/2,然后在循环中获取i + val_pos。这不是非常干净的方法,但可以节省一些查询。由于时间限制,目前只能再次查询以获得清晰度,但仍然欢迎使用commons库中的良好方法来循环遍历格式为该格式的xml文件。 - James DeRagon
2个回答

4

一种选项是选择 attr 元素,并将其作为 HierarchicalConfiguration 对象进行迭代:

List<HierarchicalConfiguration> nodes = config.configurationsAt("attrs/attr");
for(HierarchicalConfiguration c : nodes ) {
    ConfigurationNode node = c.getRootNode();
    System.out.println(
        "name:" + ((ConfigurationNode) 
                            node.getAttributes("name").get(0)).getValue() +
        " VAL:" + ((ConfigurationNode) 
                            node.getAttributes("val").get(0)).getValue());
}

虽然不够漂亮,但是它能正常工作。


这确实可行。我尝试计时两个函数,这个函数比另一个函数快(以纳秒为单位)。原先的函数:295,377,206,而这个函数是:12,712,510。谢谢!我会使用这个方法。 - James DeRagon

0
如何使用commons XML配置获取与给定属性匹配的标签的值,例如在此xml示例中?
<attrs>
    <attr name="my_name"> First Name</attr>
    <attr name="my_name2"> First Name 2 </attr>
</attrs>

想要获取匹配 my_name 属性值的 First Name 值。

在答案部分不应该提问,这不像论坛。您可以评论或提出新问题。 - Afshin Moazami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接