Apache commons配置是否忽略最外层的XML标记?为什么?我做错什么了吗?

Apache commons配置是否忽略最外层的XML标记?为什么?我做错什么了吗?,xml,apache-commons-config,Xml,Apache Commons Config,好的,几年前我曾经使用ApacheCommons配置,可能忘记了一些事情 我对正在发生的事情有点困惑,这似乎与我的直觉背道而驰 下面是我的代码: public static void main(String[] args) throws ConfigurationException { XMLConfiguration config = new XMLConfiguration("config/base-config.xml"); config.setExpressionEngi

好的,几年前我曾经使用ApacheCommons配置,可能忘记了一些事情

我对正在发生的事情有点困惑,这似乎与我的直觉背道而驰

下面是我的代码:

public static void main(String[] args) throws ConfigurationException {
    XMLConfiguration config = new XMLConfiguration("config/base-config.xml");
    config.setExpressionEngine(new XPathExpressionEngine());
    List<Object> recipients;
    recipients = config.getList("emailRecipients/recipient");
    System.out.println("Recipients: " + recipients.size());
    for (Object recipient : recipients) {
        System.out.println("\tRecipient: " + recipient);
    }
}
publicstaticvoidmain(字符串[]args)抛出ConfigurationException{
XMLConfiguration config=newxmlconfiguration(“config/base config.xml”);
config.setExpressionEngine(新的XPathExpressionEngine());
列出收件人名单;
recipients=config.getList(“emailRecipients/recipient”);
System.out.println(“收件人:+Recipients.size());
用于(对象收件人:收件人){
System.out.println(“\t收件人:+收件人”);
}
}
这是我的xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<emailRecipients>
    <recipient>me@email.com</recipient>
    <recipient>you@email.com</recipient>
</emailRecipients>

me@email.com
you@email.com
但是,我的代码不会像预期的那样读取收件人标记

相反,我必须修改我的配置文件,使其如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<arbitrary-outer-tag>
    <emailRecipients>
        <recipient>me@email.com</recipient>
        <recipient>you@email.com</recipient>
    </emailRecipients>
</arbitrary-outer-tag>

me@email.com
you@email.com
因此,在查找所需的配置项时,似乎XPath表达式中必须忽略最外层的标记

为什么呢?这是故意的吗?我做错什么了吗?

你是对的。在中,根据设计,在指定键时忽略根。从下面的例子考虑:


#808080
#000000
#008000
${colors.header}
15
好的,取消,救命
下面肯定根被忽略了:

构造键时忽略根元素。在这个例子中,你 不要编写gui-definition.color.text,而只编写color.text

请确保您不是唯一一个对此感到疑惑的人,尤其是XPath键。但至少它是一致的。对于此XML文档

<?xml version="1.0" encoding="ISO-8859-1" ?>

<database>
  <tables>
    <table tableType="system">

:

层次结构配置配置=。。。 config.setExpressionEngine(新的XPathExpressionEngine()); //现在我们可以使用XPATH查询: List fields=config.getList(“tables/table[1]/fields/name”);
谢谢,我很感激-我太急了,没有仔细阅读该教程。但是,现在清楚了。我觉得还是有点违反直觉,但只要它是一致的,我就高兴!
<?xml version="1.0" encoding="ISO-8859-1" ?>

<database>
  <tables>
    <table tableType="system">
HierarchicalConfiguration config = ...
config.setExpressionEngine(new XPathExpressionEngine());

// Now we can use XPATH queries:
List<Object> fields = config.getList("tables/table[1]/fields/name");