Java XPath表达式错误

时间:2015-07-21 18:58:30

标签: java xml xpath

我正在尝试从我的XML数据文件中打印特定节点,例如Pantone 100。我希望打印出pantone 100的所有属性,例如所有颜色和它们持有的数据但是我不确定如何正确地格式化XPath编译方式,它只会拉出特定的pantone数字我是寻找。

编辑:下面的代码输出null

XML数据

<inventory>
    <Product pantone="100" blue="7.4" red="35" green="24"> </Product>
    <Product pantone="101" blue="5.4" red="3" rubine="35" purple="24"> </Product>
    <Product pantone="102" orange="5.4" purple="35" white="24"> </Product>
    <Product pantone="103" orange="5.4" purple="35" white="24"> </Product>
    <Product pantone="104" orange="5.4" purple="35" white="24"> </Product>
    <Product pantone="105" orange="5.4" purple="35" white="24"> </Product>
    <Product pantone="106" black="5.4" rubine="35" white="24" purple="35" orange="5.4"> </Product>
</inventory>

代码

import org.w3c.dom.*;
import javax.xml.xpath.*;
import javax.xml.parsers.*;
import java.io.IOException;
import org.xml.sax.SAXException;

public class XPathDemo {

    public static void main(String[] args)
            throws ParserConfigurationException, SAXException,
            IOException, XPathExpressionException {

        DocumentBuilderFactory domFactory
                = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true);
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse("data.xml");
        XPath xpath = XPathFactory.newInstance().newXPath();
        // XPath Query for showing all nodes value
        XPathExpression expr = xpath.compile("/inventory/Product[@pantone='100']");

        Object result = expr.evaluate(doc, XPathConstants.NODESET);
        NodeList nodes = (NodeList) result;
        for (int i = 0; i < nodes.getLength(); i++) {
            System.out.println(nodes.item(i).getNodeValue());
        }
    }
}

输出 空

2 个答案:

答案 0 :(得分:3)

我不是xpath的专家(从字面上了解到它今天)所以我不是百分之百确定这个,但你有/inventory/product/pantone/text(@=100),而是试试这个:

/inventory/Product[@pantone='100']

据我了解,这会使Product与属于pantone的属性"100"相匹配。

至于打印数据,我不确定,但希望这会让你走上正轨。

  

修改:查看此页面:Node。它是Node类型的javadoc。正如geert3在他/她的回答中所说getNodeValue()返回节点的值,在这种情况下是元素的值,而不是属性(例如:在<element>value</element>中元素元素的值是值)在你的情况下是null,因为它是空的(如果它认为类型是字符串可能是""而不是null?)。

     

尝试拨打Node#getAttributes(),然后使用NamedNodeMapNamedNodeMap#item(int)内进行迭代,以获取Node 这些 应该是属性(我想,如果我正确理解API)。 getNodeName()应该是属性的名称(例如pantone),getNodeValue()应该是属性的值(例如100)。

答案 1 :(得分:2)

输出为空,因为此处getNodeValue不适用。 getTextContent会在开始和结束标记之间为您提供文字,例如这个例子中的FOOBAR:

<Product pantone="100" blue="7.4" red="35" green="24">FOOBAR</Product>`.

但是,如果要打印结果集的所有属性值:

    NodeList nodes = (NodeList)result;
    for (int i = 0; i < nodes.getLength(); i++)
    {
        NamedNodeMap a = nodes.item(i).getAttributes();
        for (int j=0; j<a.getLength(); j++)
            System.out.println(a.item(j));
    }

或使用a.item(j).getNodeName()a.item(j).getNodeValue()分别检索属性名称或值。